2

由于NavigationButton不再可用,如何检查NavigationLink中的条件以导航到另一个视图?


NavigationLink(destination: Dashboard(userName: self.userId, 
                                      password: self.password), isActive: $showDashboard) {

                    Button(action: {
                        if self.userId.isEmpty || self.password.isEmpty {
                            self.isAlert = true
                        } else {
                            self.showDashboard = true
                        }

                    }) {
                        Text("Submit")
                            .foregroundColor(.white)
                            .font(.system(size: 22))

                        Dashboard()
                    }
                    .frame(minWidth: 150, idealWidth: 300, maxWidth: 450, 
                     minHeight: 30, idealHeight: 40, maxHeight: 50, alignment: .center)
                    .background(Color(red: 81/255, green: 221/255, blue: 182/255))

                    .padding([.leading, .trailing], 20)
                } 

编辑:-

另外,如果用户名和密码的长度超过 16,我想显示警报,如果长度超过 10,则显示不同的警报,如果长度为 0,则显示空消息警报。

4

2 回答 2

4

你可以这样做:

    NavigationView {
        VStack {
            NavigationLink(destination:  Dashboard(userName: self.userId, password: self.password), isActive: $showDashboard) {
                Text("")
            }
            Button(action: {
                 if self.userId.isEmpty || self.password.isEmpty {
                      self.isAlert = true
                  } else {
                      self.showDashboard = true
                  }
            }) {
                Text("Submit")
                    .foregroundColor(.green)
                    .font(.system(size: 22))

            }
        }
    }

要记住的一点是 NavigationLink 本身就是一个按钮,当按下它导航到 时destinationView,该isActive参数是一种强制发生这种情况的方法(无需用户单击 NavigationLink)。截至目前,我不确定如何将逻辑嵌入到 NavigationLinks 中。

希望这可以帮助 :)

编辑:

您可以做的另一件事是:

NavigationLink(destination:Dashboard(userName: self.userId, password: self.password)) {
                    Text("Submit")
                }.disabled(self.userId.isEmpty || self.password.isEmpty )

这将禁用 NavigationLink,直到两个输入字段都不为空。

于 2019-10-23T15:44:40.157 回答
1

我不确定您是否要检查条件以确定它的目的地NavigationLink或它是否被禁用,但此示例代码显示了如何同时执行这两种操作:

struct ContentView: View {
    @State var userId = ""
    @State var password = ""

    var body: some View {
        NavigationView {
            NavigationLink(destination: (self.userId.isEmpty || self.password.isEmpty) ? AnyView(Dashboard(userName: self.userId, password: self.password)) : AnyView(Text("Different view")), isActive: Binding(get: {
                return self.userId.isEmpty || self.password.isEmpty
            }, set: { (_) in

            })) {
                Text("Navigate")
            }
        }
    }
}

创建一个自定义绑定isActive来评估多个条件:

Binding(get: {
        return self.userId.isEmpty || self.password.isEmpty
}, set: { (_) in

})

并评估三元语句中的条件,如果您希望条件确定导航到哪个视图,请确保使用AnyViewType Erasure返回不同类型的视图:NavigationLink

(self.userId.isEmpty || self.password.isEmpty) ? AnyView(Dashboard(userName: self.userId, password: self.password) : AnyView(Text("Different view"))

编辑nil:如果条件评估为:如果您不希望视图转换为任何内容,则可以将其他视图设置为false

(self.userId.isEmpty || self.password.isEmpty) ? AnyView(Dashboard(userName: self.userId, password: self.password) : nil

编辑 2:如果您希望在条件失败时显示警报,请使用上述行(带有nil)作为 NavigationLink 的目的地,并添加一个也具有自定义的Binding警报isPresented

.alert(isPresented: Binding(get: {
            return self.userId.isEmpty || self.password.isEmpty
    }, set: { (_) in

    })) {
        Text("Alert message")
    }

您可以使用您正在评估的变量(在本例中为 )将此警报添加到视图中的任何子视图ContentView

于 2019-10-23T15:51:46.547 回答