热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

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

如何解决《在回调,SwiftUI中以编程方式推送View》经验,为你挑选了1个好方法。

在我看来,Apple鼓励我们放弃UIViewController在SwiftUI中使用,但如果不使用视图控件,我会觉得有些无能为力。我想要的是能够实现某种ViewModel将事件发送给的功能View

ViewModel

public protocol LoginViewModel: ViewModel {
  var onError: PassthroughSubject { get }
  var onSuccessLogin: PassthroughSubject { 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> Bohdan Savyc..:

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

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()


推荐阅读
author-avatar
手机用户2702936044
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有