我试图基于计算的属性在Swift中显示警报。基本上,每当用户单击按钮时,“回合”的值都会更新。进行了十多轮后,将显示警报。
为此,我创建了一个名为“ showingAlert”的布尔变量。这必须是一个@State变量,以便在用户关闭警报时再次将其设置为false。
但是,编译器告诉我,@State之类的属性包装器“无法应用于计算属性” :-(
这是我尝试过的代码:
Manufacturer
有什么办法解决吗?我很想创建一个显示没有错误消息的警报。
答案 0 :(得分:3)
您可以简单地使用Binding.constant(_:)。将计算的属性转换为绑定属性。
@State var round = 0
var showingAlert:Bool {round > 10 ? true : false}
func result(player: Int, app: Int) {
if player > app {
round += 1
}
else {
round += 1
}
}
var body: some View {
Button(action: {self.result(player: 1, app: 1)}) {
Text("Button")
}
.alert(isPresented: .constant(showingAlert)) {
Alert(title: Text("title"), message: Text("message"), dismissButton: .default(Text("Continue"))
)
}
答案 1 :(得分:2)
我更喜欢将逻辑放入模型中-将逻辑与视图分离-但这是可行的:
@State var round = 0
@State var showingAlert:Bool = false
func result(player: Int, app: Int) {
if player > app {
round += 1
} else {
round += 1
}
if round > 10 {
showingAlert.toggle()
}
}
基本上,将支票移入功能。注意:
if/else
中有一个错字,因为他们俩都做同样的事情。showingAlert
设置为true-解除警报时,让SwiftUI将其设置为false。round
。这是执行此操作的代码:导入SwiftUI 导入合并
class Model : ObservableObject {
var objectWillChange = PassthroughSubject<Void, Never>()
@Published var showingAlert = false {
willSet {
objectWillChange.send()
if newValue == false {
round = 0
}
}
}
var round = 0
func result(player: Int, app: Int) {
if player > app {
round += 1
} else {
round += 1
}
if round > 10 {
showingAlert.toggle()
}
}
}
struct ContentView: View {
@EnvironmentObject var model: Model
var body: some View {
Button(action: {self.model.result(player: 1, app: 1)}) {
Text("Button")
}
.alert(isPresented: self.$model.showingAlert) {
Alert(title: Text("title"), message: Text("message"), dismissButton: .default(Text("Continue")))
}
}
}
请注意,只有一个标记为showingAlert
的变量(@Published
),您可以针对willSet
进行适当的编码,而在ContentView
中需要更改的只是正确添加EnvironmentObject after your add it to your
SceneDelegate`。
第一组代码将在第11次点击后显示警报,然后在每次点击后显示警报。第二组代码将在第11次点击后显示警报,然后每11次点击显示一次。