Apple は SwiftUI での の使用をあきらめるように勧めているように思えますが、ビュー コントローラを使用しないと、少し無力感を感じます。私が望んでいるのは、 にイベントを発行する のUIViewController
ような を実装できるようにすることです。ViewModel
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を使用していて、ログインが成功した場合に別のコントローラーをプッシュする方法がわかりません
また、私が望むものをより良い方法で実装する方法についてアドバイスをいただければ幸いです。ありがとうございます。
ベストアンサー1
答えを見つけました。コールバックの別のビューを表示したい場合は、
状態を作成する
@State var pushActive = false
ViewModelがログイン成功を通知すると
pushActive
、true
func handleSuccessfullLogin() { self.pushActive = true print("handleSuccessfullLogin") }
隠しファイルを作成し
NavigationLink
、その状態にバインドするNavigationLink(destination: ProfileView(viewModel: ProfileViewModelImpl()), isActive: self.$pushActive) { EmptyView() }.hidden()