我想运行帐户创建逻辑,然后,如果成功,则过渡到目标 View 。否则,我将出示错误表。单击后,NavigationLink会立即转换到目标 View 。
如果我使用isActive重载和一个空字符串作为文本创建一个幻影NavigationLink(它会创建一个带有零帧的 View ),则可以使其工作。然后,我使用向用户显示的按钮切换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)
}
有一个更好的方法吗?从按钮触发运行帐户创建逻辑,然后激活幻像导航链接以过渡到下一个屏幕,似乎是一种不好的做法。
最佳答案
有一种非常简单的方法来处理 View 的状态和NavigationLinks
。
您可以通过将NavigationLink
绑定(bind)到tag
来执行自身。
然后,您可以设置/取消设置标签并控制NavigationLink
。
struct SwiftView: View {
@State private var actionState: Int? = 0
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("Destination View"), tag: 1, selection: $actionState) {
EmptyView()
}
Text("Create Account")
.onTapGesture {
self.asyncTask()
}
}
}
}
func asyncTask() {
//some task which on completion will set the value of actionState
self.actionState = 1
}
}
在这里,我们已将
actionState
与NavigationLink
绑定(bind)在一起,因此,每当actionState
的值更改时,它将与与我们的tag
关联的NavigationLink
进行比较。您的目标 View 将不可见,直到您将
actionState
的值设置为等于与我们的tag
关联的NavigationLink
为止。这样,您可以创建任意数量的
NavigationLinks
,并可以通过仅更改一个Bindable
属性来控制它们。谢谢,希望对您有所帮助。
关于SwiftUI NavigationLink : Navigate to a destination view AFTER running account creation code successfully,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57697827/