Navigation 如何在SwiftUI中使用带条件检查的按钮进行导航

Navigation 如何在SwiftUI中使用带条件检查的按钮进行导航,navigation,swiftui,navigationlink,Navigation,Swiftui,Navigationlink,由于NavigationButton不再可用,如何在NavigationLink中检查条件以导航到另一个视图 NavigationLink(destination: Dashboard(userName: self.userId, password: self.password), isActive: $showDashboard) { Button(action: {

由于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,则显示空消息警报。

您可以执行以下操作:

    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,直到两个输入字段都不为空。

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

struct ContentView:View{
@State var userId=“”
@State var password=“”
var body:一些观点{
导航视图{
导航链接(目标:(self.userId.isEmpty | | self.password.isEmpty)?AnyView(仪表板(用户名:self.userId,密码:self.password)):AnyView(文本(“不同视图”)),isActive:Binding(获取:{
返回self.userId.isEmpty | | self.password.isEmpty
},在中设置:{(_)
})) {
文本(“导航”)
}
}
}
}
isActive
创建自定义绑定以评估多个条件:

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

})
并评估a中的条件,确保使用
AnyView
进行类型擦除,如果您希望这些条件确定
NavigationLink
导航到哪个视图:

(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
)作为导航链接的目的地,并添加一个警报,该警报还具有
isPresented
的自定义
绑定

.alert(显示:绑定(获取:{
返回self.userId.isEmpty | | self.password.isEmpty
},在中设置:{(_)
})) {
文本(“警报消息”)
}

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

如果条件失败,我想显示警报。那么这是怎么可能的呢?如果警报是真的,您可以使用
self.isAlert
来显示警报。但是在哪里呢?目的地状况检查?这超出了本问题的范围。如果这个回答帮助您导航接受它,那么您可以询问警报您的代码工作正常,但按钮只能在中点单击。我希望整个按钮可点击,如果条件失败,我希望显示警报。那么这怎么可能呢?@dineshsharma检查我的代码,我只是编辑它来添加信息。