我怎样才能做一个NavigationButton
在进入下一个视图之前等待服务器响应?
我尝试过这样的事情
NavigationButton(destination: LogonView(), onTrigger: { () -> Bool in
return self.viewModel.responseReceived
}) {
Text("OK")
}.tapAction {
self.viewModel.fetch(companyID: &self.companyID)
}
but the tapAction
从未被调用过。
我让它工作使用Button
:
Button(action: {
self.viewModel.fetch(companyID: &self.companyID)
}) {
Text("OK")
}.presentation(viewModel.shouldPresentModal ? Modal(LogonView() : nil)
// in ViewModel
var shouldPresentModal = false { // set to true when data are received from server
didSet {
didChange.send(())
}
}
但我需要在导航中显示下一个视图,而不是模态
谢谢你!
Sorin,至少在我看来,SwiftUI 仅为表示层而设计,它不应该取代您的模型。与 UIKit 不同,它是“反应式”的,因此从设计上来说,让视图执行类似模型的操作是非常困难的。
我会这样处理这个任务:
class LoginModel : BindableObject {
var didChange = PassthroughSubject<LoginModel, Never>()
private(set) var username: String? {
didSet {
didChange.send(self)
}
}
func load() {
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
self.username = "Sorin"
}
}
}
这是封装我们的登录代码的模型对象。这里的异步操作是通过简单的延迟来模拟的。
然后,观点:
public struct LoginScreen: View {
@ObjectBinding var loginObject = LoginModel()
public var body: some View {
Group {
if login.username == nil {
Text("Trying to login, please wait...")
} else {
Text("Successful login, the username is \(loginObject.username!)")
}
}.onAppear {
self.loginObject.load()
}
}
}
有更好的方法与模型对象“链接”,但显然我们在这里只看一个简单的示例。
Your NavigationButton
仅链接到登录屏幕,没有任何其他代码或触发器。
屏幕最初会显示Trying to login, please wait...
5秒后将变为Successful login, the username is Sorin
。显然,您可以疯狂地用您可能想要的任何内容替换我的文字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)