如何从外部更新SwiftUI视图状态(例如UIViewController) [英] How to update a SwiftUI view state from outside (UIViewController for example)

查看:310
本文介绍了如何从外部更新SwiftUI视图状态(例如UIViewController)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个SwiftUI视图:

I have a SwiftUI view:

struct CatView : View {

    @State var eyesOpened: Bool = false

    var body: some View {
       Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
    }
}

我正在尝试将其与常规UIViewController集成.

I'm trying to integrate it with in a regular UIViewController.

let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)

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

Now in the UIViewController if I try to set the eyesOpened property I get a

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

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

How are we supposed to make this work? Are SwiftUI views not supposed to work in this scenario?

推荐答案

@State 是错误的用法.您需要使用 @ObservedObject .

@State is the wrong thing to use here. You'll need to use @ObservedObject.

@State:用于在您的SwiftUI视图中本地发生更改时-即,您可以从SwiftUI视图自身中的切换按钮或按钮等中更改eyeOpens.

@State: Used for when changes occur locally to your SwiftUI view - ie you change eyesOpened from a toggle or a button etc from within the SwiftUI view it self.

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

@ObservedObject: Binds your SwiftUI view to an external data source - ie an incoming notification or a change in your database, something external to your SwiftUI view.

我强烈建议您观看以下 WWDC视频-通过SwiftUI进行数据流

I would highly recommend you watch the following WWDC video - Data Flow Through SwiftUI

这篇关于如何从外部更新SwiftUI视图状态(例如UIViewController)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆