#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
.