如何从外部更新SwiftUI视图状态(例如UIViewController)

时间:2019-06-22 20:09:20

标签: ios swift 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)

如果我尝试设置eyesOpened属性,现在在UIViewController中会得到一个

Thread 1: Fatal error: Accessing State<Bool> outside View.body

我们应该如何进行这项工作? SwiftUI视图在这种情况下不应该工作吗?

2 个答案:

答案 0 :(得分:1)

@State 是错误的用法。您需要使用 @ObjectBinding

@State:用于当您在SwiftUI视图中本地发生更改时-即,您从本身在SwiftUI视图中通过切换按钮或按钮等更改了eyeOpens。

@ObjectBinding::将您的SwiftUI视图绑定到外部数据源-即传入的通知或数据库中的更改,例如外部到您的SwiftUI视图。

我强烈建议您观看以下WWDC video - Data Flow Through SwiftUI

答案 1 :(得分:-3)

您可以使用一个叫做通知中心的东西。简而言之,这是一种视图之间可以相互通信而无需实际修改彼此的任何方式。

视图A的工作方式是向中心集线器发送通知,视图B从中枢听到该通知。视图B听到通知后便被激活,并调用用户定义的功能。

有关更详细的说明,请参阅: https://learnappmaking.com/notification-center-how-to-swift/