菜鸟教程小白 发表于 2022-12-13 16:12:15

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&lt;Error, Never&gt; { get }
var onSuccessLogin: PassthroughSubject&lt;Void, Never&gt; { 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(&#34;handleSuccessfullLogin&#34;)
}
</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]
查看完整版本: ios - 在回调中以编程方式推送 View ,SwiftUI