更新@State后未调用SwiftUI UIViewControllerRepresentable.updateUIViewController

Posted

技术标签:

【中文标题】更新@State后未调用SwiftUI UIViewControllerRepresentable.updateUIViewController【英文标题】:SwiftUI UIViewControllerRepresentable.updateUIViewController not being called after updating @State 【发布时间】:2019-10-29 11:40:14 【问题描述】:

我正在尝试更改 UIViewControllerRepresentable@State 并注意到在我这样做之后没有调用 updateUIViewController(_ uiViewController:context:)

我不知道这是一个错误还是我做错了什么。

例如:

struct ContentView: UIViewControllerRepresentable 
  @State var blah: Int = 0

  func makeUIViewController(context: UIViewControllerRepresentableContext<ContentView>) -> UIViewController 
    let vc = UIViewController()
    let button = UIButton(frame: CGRect(x: 40, y: 40, width: 100, height: 100))
    button.setTitle("Next", for: .normal)
    button.addTarget(context.coordinator, action: #selector(context.coordinator.nextPressed), for: .primaryActionTriggered)
    vc.view.addSubview(button)
    return vc
  

  func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ContentView>) 
    // Not being called when `blah` is updated.
    var random = SystemRandomNumberGenerator()
    let red = CGFloat(Double(random.next() % 255) / 255.0)
    let blue = CGFloat(Double(random.next() % 255) / 255.0)
    let green = CGFloat(Double(random.next() % 255) / 255.0)
    uiViewController.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1)
  


  func makeCoordinator() -> ContentView.Coordinator 
    return Coordinator(self)
  


  final class Coordinator 
    var contentView: ContentView
    init(_ contentView: ContentView) 
      self.contentView = contentView
    

    @objc func nextPressed() 
      // This is getting called.
      contentView.blah += 1
    
  

我希望看到 viewController 的背景发生变化,但是当 blah 更新时,我根本看不到 updateUIViewController 被调用。

我也尝试过传入绑定并使用@ObservableObject

谢谢!

【问题讨论】:

【参考方案1】:

您必须至少绑定一个值才能使update 工作,因为只有绑定才能使 UIViewController 加入通知链。

如果使用@state,则为本地通知,无法触发update

现在您可以@Binding var blah: Int 看到大的变化。

【讨论】:

以上是关于更新@State后未调用SwiftUI UIViewControllerRepresentable.updateUIViewController的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI @State 变量未更新

SwiftUI - 更新@State 不会改变视图

SwiftUI,为啥部分视图没有刷新? @State 变量未更新

SwiftUI - @State 属性未更新

在 SwiftUI 中使用 @State 属性包装器未更新视图

SwiftUI 闭包更新 @State init