Я не уверен, хотите ли вы проверить условия, чтобы определить пункт назначения 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
})
и оцените условия в троичной инструкции , убедившись, что для типа Erasure используется AnyView
возвращать различные виды представлений , если вы хотите, чтобы условия определяли, к какому представлению 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
).