如何从外部更新 SwiftUI 视图状态(例如 UIViewController)
How to update a SwiftUI view state from outside (UIViewController for example)
我有一个 SwiftUI 视图:
struct CatView : View {
@State var eyesOpened: Bool = false
var body: some View {
Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
}
}
我正在尝试将它与常规 UIViewController 集成。
let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)
现在在 UIViewController 中,如果我尝试设置 eyesOpened 属性 我会得到一个
Thread 1: Fatal error: Accessing State<Bool> outside View.body
我们应该如何完成这项工作? SwiftUI 视图不应该在这种情况下工作吗?
有一个叫做通知中心的东西你可以使用。简而言之,这是一种视图可以相互通信而无需实际修改彼此任何内容的方式。
它的工作原理是视图 A 向中央集线器发送通知,视图 B 从中央集线器听到所述通知。当视图 B 听到通知时,它会激活,并调用用户定义的函数。
更详细的解释可以参考:
https://learnappmaking.com/notification-center-how-to-swift/
@State 在这里使用是错误的。您需要使用 @ObservedObject。
@State: 用于在 本地 对您的 SwiftUI 视图发生更改时使用 - 即您通过切换或按钮等更改 eyesOpened从 SwiftUI 内部查看它自己。
@ObservedObject: 将您的 SwiftUI 视图绑定到 外部 数据源 - 即传入通知或数据库更改等外部 到您的 SwiftUI 视图。
我强烈建议您观看以下内容WWDC video - Data Flow Through SwiftUI
我有一个 SwiftUI 视图:
struct CatView : View {
@State var eyesOpened: Bool = false
var body: some View {
Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
}
}
我正在尝试将它与常规 UIViewController 集成。
let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)
现在在 UIViewController 中,如果我尝试设置 eyesOpened 属性 我会得到一个
Thread 1: Fatal error: Accessing State<Bool> outside View.body
我们应该如何完成这项工作? SwiftUI 视图不应该在这种情况下工作吗?
有一个叫做通知中心的东西你可以使用。简而言之,这是一种视图可以相互通信而无需实际修改彼此任何内容的方式。
它的工作原理是视图 A 向中央集线器发送通知,视图 B 从中央集线器听到所述通知。当视图 B 听到通知时,它会激活,并调用用户定义的函数。
更详细的解释可以参考: https://learnappmaking.com/notification-center-how-to-swift/
@State 在这里使用是错误的。您需要使用 @ObservedObject。
@State: 用于在 本地 对您的 SwiftUI 视图发生更改时使用 - 即您通过切换或按钮等更改 eyesOpened从 SwiftUI 内部查看它自己。
@ObservedObject: 将您的 SwiftUI 视图绑定到 外部 数据源 - 即传入通知或数据库更改等外部 到您的 SwiftUI 视图。
我强烈建议您观看以下内容WWDC video - Data Flow Through SwiftUI