更新@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 变量未更新