在回调,SwiftUI中以编程方式推送View

在我看来,Apple鼓励我们放弃UIViewController在SwiftUI中使用,但如果不使用视图控件,我会觉得有些无能为力。我想要的是能够实现某种ViewModel将事件发送给的功能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,我不知道如何实现以下功能:

  • 如果登录成功,则推送另一个控制器
  • 如果发生错误,则显示警报

此外,对于任何关于如何以更好的方式实现我想要的东西的建议,我也将不胜感激。谢谢。

我能够显示警报,但仍然找不到如何在viewModel的回调中推送另一个视图

回答:

我找到了答案。如果要显示回调的其他视图,则应

1)创建状态 @State var pushActive = false

2)当ViewModel通知登录成功时,将其设置pushActivetrue

  func handleSuccessfullLogin() {

self.pushActive = true

print("handleSuccessfullLogin")

}

3)创建隐藏NavigationLink并绑定到该状态

  NavigationLink(destination: ProfileView(viewModel: ProfileViewModelImpl()), isActive: self.pushActive) {

Text("")

}.hidden()

以上是 在回调,SwiftUI中以编程方式推送View 的全部内容, 来源链接: utcz.com/qa/420949.html

回到顶部