SwiftUI基于计算的属性显示警报

时间:2019-10-27 11:13:38

标签: swift swiftui computed-properties property-binding

我试图基于计算的属性在Swift中显示警报。基本上,每当用户单击按钮时,“回合”的值都会更新。进行了十多轮后,将显示警报。

为此,我创建了一个名为“ showingAlert”的布尔变量。这必须是一个@State变量,以便在用户关闭警报时再次将其设置为false。

但是,编译器告诉我,@State之类的属性包装器“无法应用于计算属性” :-(

这是我尝试过的代码:

Manufacturer

有什么办法解决吗?我很想创建一个显示没有错误消息的警报。

2 个答案:

答案 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次点击显示一次。