Это старый способ вызова NavigationLink
на Button
s.
struct ContentView: View {
@State private var selection: String? = nil
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: View1(), tag: "tag1", selection: $selection) {
EmptyView()
}
NavigationLink(destination: NotView1(), tag: "tag2", selection: $selection) {
EmptyView()
}
Button("Do work then go to View1") {
// do some work that takes about 1 second
mySleepFunctionToSleepOneSecond()
selection = "tag1"
}
Button("Instantly go to NotView1") {
selection = "tag2"
}
}
.navigationTitle("Navigation")
}
}
}
Этот код работает отлично. Он может перейти к разным View
целям в зависимости от того, какая кнопка нажата. Мало того, он гарантирует, что вся работа будет выполнена ДО перехода к целевому представлению. Однако единственная проблема заключается в том, что 'init(destination:tag:selection:label:)' was deprecated in iOS 16.0: use NavigationLink(value:label:) inside a List within a NavigationStack or NavigationSplitView
Я понимаю NavigationStack
это круто и все такое. Но как я могу перевести код для использования новых NavigationStack
+ NavigationLink
. В частности, как я могу убедиться, что работа выполнена перед навигацией?
Для использования не устаревших и после выполнения некоторой работы, если мы хотим перейти к следующему представлению или в любом представлении, есть что-то, называемое «.navigationDestination». Давайте посмотрим, что на простом примере.
@State var bool : Bool = false
var body: some View {
NavigationStack {
VStack {
Text("Hello, world!")
Button {
//Code here before changing the bool value
bool = true
} label: {
Text("Navigate Button")
}
}.navigationDestination(isPresented: $bool) {
SwiftUIView()
}
}
}
В этом коде мы меняем логическое значение как false и меняем его на true, когда наша работа выполняется с помощью кнопки.
.navigationDestination(isPresented: Binding<Bool>, destination: () -> View)
В .navigationDestination передайте логическое значение Binding и укажите представление, по которому вы хотите перемещаться.
Вы можете использовать .navigationDestination несколько раз.
Надеюсь, вы нашли это полезным.
Используя новый NavigationStack
и его свойство пути, вы можете сделать гораздо больше. Ваш пример будет преобразован в
struct ContentView: View {
@State private var path = [String]()
var body: some View {
NavigationStack(path: $path) {
VStack {
Button("Do work then go to View1") {
// do some work that takes about 1 second
mySleepFunctionToSleepOneSecond()
path.append("tag1")
}
Button("Instantly go to NotView1") {
path.append("tag2")
}
}
.navigationTitle("Navigation")
.navigationDestination(for: String.self) { route in
switch route {
case "tag1":
EmptyView()
case "tag2":
EmptyView()
default:
EmptyView()
}
}
}
}
}
Посмотрите это видео. Там вы можете найти больше вариантов использования.
Не могли бы вы уточнить?
Экраны складываются, поэтому они заменяют исходный вид как в macOS, так и в iOS, вместо предоставления боковой панели для навигации в macOS, как это делает NavigationView. NavigationSplitView ближе, но также отображается и ведет себя иначе, чем NavigationView в macOS.
Это не дает того же результата