Отправка навигационной ссылки через isActive немедленно отклоняется

#swift #swiftui #swiftui-navigationlink #swiftui-navigationview

#swift #swiftui #swiftui-navigationlink #swiftui-navigationview

Вопрос:

Я хочу инициализировать стек навигации в SwiftUI. Таким образом, я хочу запустить второе представление сразу после появления первого представления. Поэтому я хочу использовать переменную @State, для которой я установил значение true при появлении, и, таким образом, активирует NavigationLink.

Однако этот подход не работает (без изменений, см. Ниже). Нажатие выполняется, а затем второе представление немедленно отклоняется (видео). Это мой образец (репозиторий Github):

 struct SecondView: View {
  var body: some View {
    Text("Second")
      .navigationTitle("Second")
      .onAppear(perform: {
        print("Second: onAppear")
      })
  }
}

struct FirstView: View {
   @State var linkActive = false

   var body: some View {
     NavigationLink(destination: SecondView(), isActive: $linkActive) {
       Text("Goto second")
     }
     .navigationTitle("First")
     .onAppear(perform: {
       print("First: onAppear")
       linkActive = true
     })
     .onChange(of: linkActive) { value in
       print("First: linkActive changed to: (linkActive)")
     }
   }
 }

 struct SwiftUIView: View {
   var body: some View {
     NavigationView {
       NavigationLink(destination: FirstView()) {
         Text("Goto first")
       }
     }
     .navigationViewStyle(StackNavigationViewStyle())
   }
}
 

Вывод:

 First: onAppear
First: linkActive changed to: true
Second: onAppear
First: linkActive changed to: false
 

Если я изменю onAppear, чтобы установить для linkActive значение true после задержки в 0,5 секунды, это сработает. Что здесь не так? Я ожидаю, что secondView останется на экране, поскольку я не понимаю, почему isActive изменен обратно на false.

Комментарии:

1. Проблема заключается в том, что вы используете локальное состояние, если можете создать абстрактное представление, или используете делегат, если он это поддерживает. Ознакомьтесь с этой статьей, если она может вам помочь code.tutsplus.com/tutorials /…

2. Я использую локальный @State, конечно. Но я не понимаю, как ваша похвала и ссылка связаны с моим вопросом. Я не специально делюсь данными между представлениями.

3. каждый раз, когда вы пытаетесь сохранить данные, называется общим доступом к данным, и то, что вы пытаетесь сделать, это повторно указать своему второму представлению изменить данные первого представления, что не сработает, если только ваши данные не являются глобальным делегатом, и статья, отправленная вам, предполагает, дает более четкое представление о что делать в лучшем подходе.

4. Либо я совершенно глуп и не понимаю вашего комментария, либо мы говорим мимо друг друга. Второе представление не делает ничего активного, у него нет доступа к NavigationLink, который используется для его отображения. Здесь я использую базовые концепции из SwiftUI. И с вашим комментарием о частных, общедоступных классах … лучше не становится (вы видели, что мы используем здесь структуры). Я чувствую себя троллем.

5. Должно быть, я неправильно прочитал ваше исходное сообщение, потому что я самостоятельно обнаружил, что если я изменю isActive на true через 0,5 секунды, это сработает. Я тестировал только с шагом 0,1 с, но все, что я могу предложить, это еще одна точка данных, в которой я вижу то же поведение. 0,4 с, и он немедленно возвращается. 0,5, и он остается включенным SecondView .