Пункт назначения NavigationLink открыт без включенного isActive

у меня есть с простым текстом. Должен открывать секретную страницу входа в систему, если определенные условия проверяются.

Но я заметил, что могу обойти " " с двумя простыми трюками:

  1. нажмите и удерживайте текст и отпустите , секретный вид автоматически загружается
  2. нажмите и перетащите текст, секретный вид автоматически загрузится

Поэтому я решил реализовать и поймать .
Реализуя его, я решил проблему №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)
        }
    }
}
Другие вопросы по тегам