【问题标题】:How to navigate using button with condition check in SwiftUI如何在 SwiftUI 中使用带有条件检查的按钮进行导航
【发布时间】:2019-10-23 14:32:47
【问题描述】:

由于 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)
                } 

编辑:-

如果 userNamepassword 的长度超过 16,我想显示警报,如果长度超过 10,则显示不同的警报,如果长度为 0,则显示空消息警报.

【问题讨论】:

    标签: navigation swiftui navigationlink


    【解决方案1】:

    你可以这样做:

        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 本身就是一个按钮,当按下它时导航到destinationViewisActive 参数是一种强制发生这种情况的方法(无需用户单击 NavigationLink)。到目前为止,我不确定如何将逻辑嵌入到 NavigationLinks 中。

    希望这会有所帮助:)

    编辑:

    你可以做的另一件事是:

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

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

    【讨论】:

    • 如果条件失败,我想显示警报。那怎么可能呢?
    • 如果为真,您可以使用self.isAlert 显示警报。
    • 但是在哪里?在目的地条件检查中?
    • 这超出了这个问题的范围。如果这个回答帮助您导航接受它,那么您可以询问警报
    • 您的代码运行良好,但按钮只能在中间点单击。我想要整个按钮可点击
    【解决方案2】:

    我不确定您是否要检查条件以确定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
    
    })
    

    并评估ternary statement 中的条件,如果您希望条件确定NavigationLink 导航到哪个视图,请确保使用AnyView 进行类型擦除to return different kinds of views

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

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

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

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

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

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

    【讨论】:

    • 如果条件失败,我想显示警报。那怎么可能呢?
    • @dineshsharma 检查我的代码,我刚刚编辑它以添加该信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多