在我看来,Apple鼓励我们放弃UIViewController在SwiftUI中使用,但如果不使用视图控件,我会觉得有些无能为力。我想要的是能够实现某种ViewModel将事件发送给的功能View。
UIViewController
ViewModel
View
ViewModel :
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,我不知道如何实现以下功能:
此外,对于任何关于如何以更好的方式实现我想要的东西的建议,我也将不胜感激。谢谢。
更新1: 我能够显示警报,但仍然找不到如何在viewModel的回调中推送另一个视图
我找到了答案。如果要显示回调的其他视图,则应
1)创建状态 @State var pushActive = false
@State var pushActive = false
2)当ViewModel通知登录成功时,将其设置pushActive为true
pushActive
true
func handleSuccessfullLogin() { self.pushActive = true print("handleSuccessfullLogin") }
3)创建隐藏NavigationLink并绑定到该状态
NavigationLink
NavigationLink(destination: ProfileView(viewModel: ProfileViewModelImpl()), isActive: self.pushActive) { Text("") }.hidden()