我有一个呈现SwiftUI的swift UIHostingController。我在视图中调用了一个函数,它构建得很好,但没有创建预期的输出。
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")")可以工作,但是当从宿主控制器调用时,它就不能工作了。
任何帮助都将不胜感激。
发布于 2019-12-08 00:29:09
实际上,SwiftUI是反应式的状态机,并且所有的视图都是结构值,所以你需要改变概念,而不是必须发送消息来指定状态依赖和对这些状态的反应……
因此,保持您的自定义主机控制器,它可以像下面这样设置
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")
}
}
}https://stackoverflow.com/questions/59227864
复制相似问题