更新 UIViewRepresentable 中的绑定

Posted

技术标签:

【中文标题】更新 UIViewRepresentable 中的绑定【英文标题】:Update Binding in UIViewRepresentable 【发布时间】:2021-05-13 01:10:36 【问题描述】:

我有一个调用 UIViewRepresentable 视图的 swiftUI 视图。在 SwiftUI 视图中,我正在切换 @State 布尔值的状态。

在我的 UIViewRepresentable 视图中,我创建了一个从 SwiftUI 主视图传递过来的绑定。问题是绑定永远不会更新,或者至少在 UIViewRepresentable 视图中没有调用 updateView 函数。我觉得我一定做错了什么,但我只是忽略了它。这是我正在尝试做的一个示例。

  import Foundation
  import SwiftUI

 struct BindingTest: UIViewRepresentable 

@Binding var status: Bool


func makeUIView(context: Context) -> UIActivityIndicatorView 
    
    let activityIndicator = UIActivityIndicatorView()
    
    activityIndicator.style = .large
    
    return activityIndicator


func updateUIView(_ uiView: UIViewType, context: Context) 
    
    
    print("Hello")
    






 import SwiftUI

 struct ChartView: View 

@State var status = false

var body: some View 

    
    VStack
        
        Spacer()
    
    Button(action: 
        
       status = !status
        
    ) 
        
        Text("Change")
        
    

    BindingTest(status: $status)
    
    
        
    


我正在使用 Xcode 12.5 和 Swift 5.4

【问题讨论】:

【参考方案1】:

看起来 SwiftUI 在幕后做了一些对我们来说并不明显的聪明才智。因为您实际上并没有使用您在updateUIView 中的绑定,所以它实际上并没有被调用。

但是,如果您将代码更新为以下内容:

func updateUIView(_ uiView: UIViewType, context: Context) 
  print("Hello \(status)")

然后你会看到它确实被调用了。

PS - 你可以使用status.toggle() 代替status = !status

【讨论】:

感谢我没有想到要尝试这个。我以为绑定会自动调用updateUIView。但正如你所说,SwiftUI 肯定比引擎盖下的更智能。

以上是关于更新 UIViewRepresentable 中的绑定的主要内容,如果未能解决你的问题,请参考以下文章

UIViewRepresentable 视图不更新值

如何使用 ObservableObject 更新 UIViewRepresentable

如何通过 Binding 和 ObservedObject 更新 UIViewRepresentable 地图

列表中的 UIViewRepresentable 行在 SwiftUI 中消失

TableView 重新加载不适用于 SwiftUI 中的 UIViewRepresentable

UIViewRepresentable 在 SwiftUI 中的列表单元格中的位置