如何解决SwiftUI仅在某些条件下允许切换
我的应用程序具有付费功能。我有一个切换,用户可以切换。如果用户尚未付款,则当用户尝试切换“切换”时,应调出工作表(并且不应激活切换)。如果用户已经付款,则可以在没有问题的情况下打开和关闭切换。
我不明白简单的结构(PaidFeature
)如何访问可观察对象(Model
)。如何在SwiftUI中编写代码?
class Model: ObservableObject {
@Published var hasUserPaid: Bool = false
}
struct PaidFeature {
var isEnabled = false
}
struct ContentView: View {
@State private var feature = PaidFeature()
@EnvironmentObject var model: Model
var body: some View {
Toggle(isOn: self.$feature.isEnabled) {
Text("Hello,World!")
}
}
}
解决方法
您可以在disabled
上添加Toggle
修饰符。
struct ContentView: View {
@State private var feature = PaidFeature()
@EnvironmentObject var model: Model
var body: some View {
Toggle(isOn: self.$feature.isEnabled) {
Text("Hello,World!")
}.disabled(!model.hasUserPaid)
}
}
,
我认为应该是
var body: some View {
Toggle(isOn: self.$feature.isEnabled) {
Text("Hello,World!")
}
.disabled(!model.hasUserPaid) // << here !!
}
更新:具有展示页的替代版本的演示。经过Xcode 12 / iOS 14的测试
为简单起见,所有演示的所有状态均保持在视图中
struct DemoView: View {
@State private var feature = false
@State private var paid = false
@State private var showPurchase = false
var body: some View {
Toggle(isOn: $feature) {
Text("Hello,World!")
}
.allowsHitTesting(paid)
.contentShape(Rectangle())
.simultaneousGesture(TapGesture().onEnded {
if !self.paid {
self.showPurchase = true
}
})
.sheet(isPresented: $showPurchase) {
Text("Purchase this")
.onDisappear {
self.paid = true
}
}
}
}
,
使用Xcode 12,您可以使用.onChange
修饰符监听切换按钮的变化,并且每当用户切换按钮时,都可以将其切换回上一个状态,而是显示一个purchase this
如果该用户不是高级用户,则该表。
.onChange(self.feature.isEnabled) { isEnabled in
if isEnabled && shouldShowPurchaseSheet {
// toggle back if you want the button to go to the inactive state
// show the sheet
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。