gpt4 book ai didi

ios - 在 UIHostingController 中从 SwiftUI 调用函数

转载 作者:行者123 更新时间:2023-11-29 13:51:58 24 4
gpt4 key购买 nike

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

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")
}
}

}

函数 ("loginState(state: "success")") 在 SwiftUI View 类中调用时有效,但是当从托管 Controller 调用时它不起作用。

如有任何帮助,我们将不胜感激。

最佳答案

SwiftUI 实际上是响应式(Reactive)状态机,所有 View 都是结构值,因此您需要改变概念,而不是强制发送消息指定状态依赖和对这些状态的 react ...

因此,保留您的自定义主机 Controller ,它可以像下面这样设置

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")
}
}

}

关于ios - 在 UIHostingController 中从 SwiftUI 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59227864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com