在 SwiftUI 中将 NavigationButton 与服务器请求一起使用

Posted

技术标签:

【中文标题】在 SwiftUI 中将 NavigationButton 与服务器请求一起使用【英文标题】:Use NavigationButton with a server request in SwiftUI 【发布时间】:2019-06-14 09:43:37 【问题描述】:

如何在进入下一个视图之前创建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(())
            
        

但我需要在导航中显示下一个视图,而不是模态

谢谢!

【问题讨论】:

我觉得你正在努力实现这一点意味着 SwiftUI 还没有准备好在你的应用程序中使用它。 SwiftUI 是第一个 beta 版本,还有很多东西还没有准备好。就像这样......问多个重复的问题不会神奇地让 SwiftUI 能够做它不能做的事情。 另外,这可能不是正确的方法。下一个视图应根据模型的状态显示适当的内容;数据不存在时的微调器,数据一旦存在。 @Fogmeister 到目前为止,SwiftUI 似乎太“薄”而不能单独使用,所以我认为最好的方法是结合使用 SwiftUI 和 UIKit,在我的例子中是 UINavigationController,现在我正在阅读关于并且我正在尝试使用 UIHostingController,顺便说一句,我的最后一个问题涵盖了我在尝试实现我的应用程序时发现的不同问题,它们不是“重复的” 【参考方案1】:

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()
        
    

有更好的方法与模型对象“链接”,但显然我们在这里只看一个简单的例子。

您的NavigationButton 只会链接到登录屏幕,没有任何其他代码或触发器。 屏幕最初将显示Trying to login, please wait...,5 秒后将变为Successful login, the username is Sorin。显然,您可以疯狂地用您可能想要的任何内容替换我的文字。

【讨论】:

非常感谢!在过去的 8 个小时里,我一直在研究如何做到这一点,在这里你可以用一种简单明了的方式。 ??谢谢

以上是关于在 SwiftUI 中将 NavigationButton 与服务器请求一起使用的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中将部分文本加粗

如何在swiftUI中将背景颜色添加到列表中

如何在 SwiftUI 中将 TabView 与 NavigationView 一起使用?

如何在 SwiftUI 中将 LocalizedStringKey 更改为 String

在 ScrollView 中将文本对齐为前导 - SWIFTUI

如何在 SwiftUI 中将模糊效果作为背景?