【发布时间】:2019-08-28 18:00:53
【问题描述】:
我想运行帐户创建逻辑,然后如果成功,则转换到目标视图。否则,我将提供错误表。 NavigationLink 立即转换到点击的目标视图。
如果我使用 isActive 重载和一个空字符串作为文本创建一个虚拟 NavigationLink(这会创建一个零帧视图),我可以让它工作。然后,我使用向用户提供的 Button 切换 isActive 属性,该按钮首先运行帐户创建逻辑,并在链的末尾将 NavigationLink 切换为活动状态。我在 NavigationView 中。
@State private var isActive: Bool = false
NavigationView {
// Name, Email, Password Textfields here
// Button to run account creation logic:
Button(action: {
// Account creation promise chain here, then...
self.isActive.toggle()
}) {
Text("Create Account")
}
// Phantom navigation link:
NavigationLink("", destination: VerifyEmailView(email: email), isActive: self.$isActive)
}
有没有更好的方法来做到这一点?从按钮触发运行帐户创建逻辑,然后激活虚拟导航链接以转换到下一个屏幕,这似乎是一种不好的做法。
【问题讨论】:
-
我的答案(以及同一个问题中的另一个答案)可能很有趣:stackoverflow.com/a/57717462/1311272
-
谢谢 Sajjon,这两个答案都很有趣。我正在尝试使用最 SwiftUI-y 的方式,所以@kontiki 的回答很有帮助,谢谢你指点我。使用 SwiftUI 对我来说最困难的部分是 1)在逻辑成功运行后在同一个 NavigationView“堆栈”中转换(即创建帐户以验证电子邮件视图),以及 2)转换到新的 NavigationView“堆栈”(即成功登录到带有自己的 NavigationView“堆栈”的主视图)。
-
一般听起来你很难思考异步?从您的代码看来,您认为 VerifyEmail 的 NavigationLink 将在创建帐户后执行。事实并非如此,这与视图的定位有关,而不是执行顺序。
-
你知道如何使用 UIKIT 做到这一点吗?
-
是的,这就是我遇到的困难 - 如何让 NavigationLink 仅在帐户创建承诺链完成后才能激活。我在 UIKit 中构建了它,我正在尝试将所有视图和转换转换为 SwiftUI。现在我使用 PromiseKit 并在最后一个块中将新的视图控制器推送到堆栈上。我很难理解如何完成相同的异步工作,然后只有在成功的情况下才推送新的控制器。
标签: swiftui