コールバックでプログラム的にビューをプッシュする、SwiftUI 質問する

コールバックでプログラム的にビューをプッシュする、SwiftUI 質問する

Apple は SwiftUI での の使用をあきらめるように勧めているように思えますが、ビュー コントローラを使用しないと、少し無力感を感じます。私が望んでいるのは、 にイベントを発行する のUIViewControllerような を実装できるようにすることです。ViewModelView

ビューモデル:

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を使用していて、ログインが成功した場合に別のコントローラーをプッシュする方法がわかりません

また、私が望むものをより良い方法で実装する方法についてアドバイスをいただければ幸いです。ありがとうございます。

ベストアンサー1

答えを見つけました。コールバックの別のビューを表示したい場合は、

  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) {
         EmptyView()
    }.hidden()
    

おすすめ記事