在我看来,Apple 是在鼓励我们放弃在 SwiftUI 中使用 UIViewController
,但不使用 View Controller ,我感觉有点力不从心。我想要的是能够实现某种ViewModel
,它将向View
发出事件。
View 模型:
public protocol LoginViewModel: ViewModel {
var onError: PassthroughSubject<Error, Never> { get }
var onSuccessLogin: PassthroughSubject<Void, Never> { get }
}
查看:
public struct LoginView: View {
fileprivate let viewModel: LoginViewModel
public init(viewModel: LoginViewModel) {
self.viewModel = viewModel
}
public var body: some View {
NavigationView {
MasterView()
.onReceive(self.viewModel.onError, perform: self.handleError)
.onReceive(self.viewModel.onSuccessLogin, perform: self.handleSuccessfullLogin)
}
}
func handleSuccessfullLogin() {
//push next screen
}
func handleError(_ error: Error) {
//show alert
}
}
使用 SwiftUI,如果登录成功,我不知道如何推送另一个 Controller
另外,如果您能提供任何关于如何以更好的方式实现我想要的东西的建议,我将不胜感激。谢谢。
我找到了答案。如果你想在回调中显示另一个 View ,你应该
创建状态@State var pushActive = false
当 ViewModel 通知登录成功时,将 pushActive
设置为 true
func handleSuccessfullLogin() {
self.pushActive = true
print("handleSuccessfullLogin")
}
创建隐藏的 NavigationLink
并绑定(bind)到该状态
NavigationLink(destination:
ProfileView(viewModel: ProfileViewModelImpl()),
isActive: self.$pushActive) {
EmptyView()
}.hidden()
关于ios - 在回调中以编程方式推送 View ,SwiftUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315409/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |