在进入下一个 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/

10-14 20:10