Как перемещаться с помощью кнопки с проверкой состояния в SwiftUI - PullRequest
0 голосов
/ 23 октября 2019

Поскольку 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)
                } 

Изменить: -

Также я хочу показать предупреждение, если длина userName и пароль больше 16, и другое предупреждение, если длина больше 10 ипредупреждение о пустом сообщении, если длина равна 0.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я не уверен, хотите ли вы проверить условия, чтобы определить пункт назначения 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).

0 голосов
/ 23 октября 2019

Вы можете сделать что-то вроде этого:

    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.

Надеюсь, это поможет:)

РЕДАКТИРОВАТЬ:

Еще одна вещь, которую вы можетеdo следующее:

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

Это приведет к отключению NavigationLink, пока оба поля ввода не станут пустыми.

...