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

标签 ios swift 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

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

最佳答案

我找到了答案。如果你想显示回调的另一个 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/

相关文章:

ios - 从 iOS 11 搜索 Controller 导航时不需要的 UITableView 重新加载动画

ios - Swiftui 似乎无法与 Cocoapods 和 Firebase 一起正常工作

SwiftUI,如何使用等待 urlSession.upload(...) 上传多部分/表单数据文件时获取进度

ios - Swift:根据秒数格式化时间字符串

ios - 使用 TableView 将两个属性信息添加到单个核心数据实体中的有效方法

ios - 切换相机权限会导致崩溃

ios - SwiftUI 组中的第一个对象重叠

ios - 如何使用 ALAssetsLibrary 检索照片的文件大小?

ios - 在分段控件中向 TableView 添加数据的问题

swiftui - @EnvironmentObject 通过 navigationLink 不能很好地工作