Пункт назначения NavigationLink открыт без включенного isActive
у меня есть
Но я заметил, что могу обойти "
- нажмите и удерживайте текст и отпустите , секретный вид автоматически загружается
- нажмите и перетащите текст, секретный вид автоматически загрузится
Поэтому я решил реализовать и поймать
Реализуя его, я решил проблему №1, но секунды все равно есть.
Вот видео, которое лучше объясняет этот вопрос: https://youtu.be/vuaT3lwUhLg
Вот простой фрагмент, записанный на видео:
// the secret logged page
struct LoggedView: View {
var body: some View {
Text("secret view")
}
}
// the example
struct ContentView: View {
// loginSuccess is FALSE, so LoggedView() should not be called...
@State var loginSuccess: Bool = false
var body: some View {
NavigationView {
NavigationLink(destination: LoggedView(), isActive: $loginSuccess) {
Text("LOGIN")
.background(Color.yellow)
.foregroundColor(.black)
.padding()
.onTapGesture(perform: {
// false, disabled to show the issue
loginSuccess = false
})
// if not implemented, longpress load the secret view
.onLongPressGesture {}
}
}
}
}
Что с этим не так?
Является ли это неправильной реализацией (как я полагаю) или быстрой ошибкой?
2 ответа
Я предполагаю, что вы просто хотели активировать навигацию программно, поэтому вам нужен активный элемент, такой как кнопка или нажимаемый вид и скрытая ссылка.
Вот возможное решение для вашего кода
var body: some View {
NavigationView {
Text("LOGIN") // << activator !!
.background(Color.yellow)
.foregroundColor(.black)
.padding()
.onTapGesture(perform: {
// false, disabled to show the issue
loginSuccess = false
})
.background(
NavigationLink(destination: LoggedView(), isActive: $loginSuccess) {
EmptyView() // << hidden !!
})
}
}
Что с этим не так?
Вы можете ошибиться в роли
isActive
. Это не для включения/отключения ссылки. Он предназначен для хранения состояния независимо от того, активен ли в данный момент целевой вид или нет.
Почему бы вам просто не использовать
disabled(_:)
?
struct ContentView: View {
@State var loggedViewActive: Bool = false
// loginSuccess is FALSE, so LoggedView() should not be called...
@State var loginSuccess: Bool = false
var body: some View {
NavigationView {
NavigationLink(destination: LoggedView(), isActive: $loggedViewActive) {
Text("LOGIN")
.background(Color.yellow)
.foregroundColor(.black)
.padding()
}
.disabled(!loginSuccess)
}
}
}