OGeek|极客世界-中国程序员成长平台

标题: ios - 在回调中以编程方式推送 View ,SwiftUI [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 16:12
标题: ios - 在回调中以编程方式推送 View ,SwiftUI

在我看来,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

另外,如果您能提供任何关于如何以更好的方式实现我想要的东西的建议,我将不胜感激。谢谢。



Best Answer-推荐答案


我找到了答案。如果你想在回调中显示另一个 View ,你应该

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

  2. 当 ViewModel 通知登录成功时,将 pushActive 设置为 true

    func handleSuccessfullLogin() {
        self.pushActive = true
        print("handleSuccessfullLogin")
    }
    
  3. 创建隐藏的 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