ios - 在回调中以编程方式推送 View ,SwiftUI
<p><p>在我看来,Apple 是在鼓励我们放弃在 SwiftUI 中使用 <code>UIViewController</code>,但不使用 ViewController ,我感觉有点力不从心。我想要的是能够实现某种<code>ViewModel</code>,它将向<code>View</code>发出事件。</p>
<p><strong> View 模型</strong>:</p>
<pre><code>public protocol LoginViewModel: ViewModel {
var onError: PassthroughSubject<Error, Never> { get }
var onSuccessLogin: PassthroughSubject<Void, Never> { get }
}
</code></pre>
<p><strong>查看</strong>:</p>
<pre><code>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
}
}
</code></pre>
<p>使用 SwiftUI,如果登录成功,我不知道如何推送另一个 Controller </p>
<p>另外,如果您能提供任何关于如何以更好的方式实现我想要的东西的建议,我将不胜感激。谢谢。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我找到了答案。如果你想在回调中显示另一个 View ,你应该</p>
<ol>
<li><p>创建状态<code>@State var pushActive = false</code></p>
</li>
<li><p>当 ViewModel 通知登录成功时,将 <code>pushActive</code> 设置为 <code>true</code></p>
<pre><code>func handleSuccessfullLogin() {
self.pushActive = true
print("handleSuccessfullLogin")
}
</code></pre>
</li>
<li><p>创建隐藏的 <code>NavigationLink</code> 并绑定(bind)到该状态</p>
<pre><code>NavigationLink(destination:
ProfileView(viewModel: ProfileViewModelImpl()),
isActive: self.$pushActive) {
EmptyView()
}.hidden()
</code></pre>
</li>
</ol></p>
<p style="font-size: 20px;">关于ios - 在回调中以编程方式推送 View ,SwiftUI,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/57315409/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/57315409/
</a>
</p>
页:
[1]