在 SwiftUI 中重置绑定变量

Posted

技术标签:

【中文标题】在 SwiftUI 中重置绑定变量【英文标题】:Reset binding variable in SwiftUI 【发布时间】:2020-06-20 10:01:15 【问题描述】:

如果我们将绑定变量(如 $saveDialog 为 true)传递给 alert 或 sheet,之后该变量将重置为 false。

.alert(isPresented: $saveDialog) 

但是如果我们想做同样的事情怎么办:当我们点击按钮时清除屏幕,通过将 $clear 设置为 true:

 Button("Clear")  self.clear = true 

然后

 DrawView(clear:$clear)

在 DrawView 中

struct DrawView: UIViewRepresentable 
    @Binding var clear:Bool

    func updateUIView(_ canvas: PKCanvasView, context: Context) 
        if clear 
            canvas.drawing = PKDrawing()
            self.clear = false // Issue
        
    

问题是:在视图更新期间修改状态,这将导致未定义的行为。在哪里将 clear 变量设置为 false?

【问题讨论】:

【参考方案1】:

这是可能的解决方案

func updateUIView(_ canvas: PKCanvasView, context: Context) 
    if clear 
        canvas.drawing = PKDrawing()

        // make on next event loop, so do not affect current update
        // which already uses `clear` state, thus avoid cycling
        DispatchQueue.main.async 
            self.clear = false
        
    

【讨论】:

这个 DispatchQueue.main.async 帮助解决了我遇到的一个非常相似的问题。我不确定我是否理解将“self.clear = false”放入 DispatchQueue.main.async 的作用。它只是告诉系统在 updateUIView() 函数完成之前不要在闭包中执行该代码吗?你怎么知道它将以什么顺序运行闭包中的代码?

以上是关于在 SwiftUI 中重置绑定变量的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 SwiftUI 中“取消绑定”变量/对象

单个 Slider 的 Swiftui 多重绑定

SwiftUI 中 MVVM 模式中多个切换的绑定变量数组

SwiftUI macOS currencyFormatter 不更新绑定变量

SwiftUI - 绑定到选择器的变量与选择器的选定值不匹配

如何将可观察对象发布的整数变量绑定到 SwiftUI 中的 textField?