首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UIHostingController中从SwiftUI调用函数

在UIHostingController中从SwiftUI调用函数
EN

Stack Overflow用户
提问于 2019-12-08 00:09:10
回答 1查看 1.4K关注 0票数 4

我有一个呈现SwiftUI的swift UIHostingController。我在视图中调用了一个函数,它构建得很好,但没有创建预期的输出。

代码语言:javascript
复制
class LoginView: UIHostingController<LoginViewComponent> {
    required init?(coder: NSCoder) {
        super.init(coder: coder, rootView: LoginViewComponent())
    }

    override func viewDidAppear(_ animated: Bool) {
        sessionHandler()
    }

    func sessionHandler(){
        let user = User()
        if user.isLoggedIn(){
            view.isUserInteractionEnabled = false
            print("Authenticating Session")
            self.rootView.loginState(state: "success")
        }else{
            view.isUserInteractionEnabled = true
            print("Needs Logging in")
        }
    }

}

当在SwiftUI视图类中调用时,函数("loginState(state:"success")")可以工作,但是当从宿主控制器调用时,它就不能工作了。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2019-12-08 00:29:09

实际上,SwiftUI是反应式的状态机,并且所有的视图都是结构值,所以你需要改变概念,而不是必须发送消息来指定状态依赖和对这些状态的反应……

因此,保持您的自定义主机控制器,它可以像下面这样设置

代码语言:javascript
复制
import SwiftUI
import UIKit
import Combine

// model that keeps login state
class LoginState: ObservableObject {
    @Published var state: String = ""
}

struct LoginViewComponent: View {
    @EnvironmentObject var loginState: LoginState // state to be observed

    ...
   // somewhere in body you use loginState.state
   // and view will be refreshed depending on state changes
}

class LoginView: UIHostingController<AnyView> {
    let loginState = LoginState() // here it is created

    required init?(coder: NSCoder) {
        super.init(coder: coder, rootView: AnyView(LoginViewComponent().environmentObject(self.loginState))) // here the ref injected
    }

    override func viewDidAppear(_ animated: Bool) {
        sessionHandler()
    }

    func sessionHandler(){
        let user = User()
        if user.isLoggedIn(){
            view.isUserInteractionEnabled = false
            print("Authenticating Session")
            self.loginState.state = "success" // here state changed
        }else{
            view.isUserInteractionEnabled = true
            print("Needs Logging in")
        }
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59227864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档