在进入下一个 View 之前,如何制作 NavigationButton
以等待服务器响应?
我试过这样的事情
NavigationButton(destination: LogonView(), onTrigger: { () -> Bool in
return self.viewModel.responseReceived
}) {
Text("OK")
}.tapAction {
self.viewModel.fetch(companyID: &self.companyID)
}
但
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(())
}
}
但我需要在导航中显示下一个 View ,而不是模态
谢谢!
最佳答案
索林,至少在我的理解 SwiftUI 只为表示层设计,它不应该取代你的模型。与 UIKit 不同,它是“响应式(Reactive)的”,因此从设计上讲,让 View 执行类似模型的操作是非常困难的。
我会像这样处理任务:
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"
}
}
}
这是封装我们登录代码的模型对象。这里的异步操作是通过一个简单的延迟来模拟的。
然后, View :
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()
}
}
}
有更好的方法与模型对象“链接”,但显然我们在这里只看一个简单的例子。
您的
NavigationButton
只会链接到 LoginScreen,没有任何其他代码或触发器。屏幕最初将显示
Trying to login, please wait...
,5 秒后将更改为 Successful login, the username is Sorin
。显然,你可以疯狂地用你想要的任何东西替换我在这里的文字。关于ios - 在 SwiftUI 中将 NavigationButton 与服务器请求一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56595542/