• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:12:15 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap