Нерекомендуемый способ вызова NavigationLink на кнопках

Это старый способ вызова NavigationLink на Buttons.

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. В частности, как я могу убедиться, что работа выполнена перед навигацией?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
170
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для использования не устаревших и после выполнения некоторой работы, если мы хотим перейти к следующему представлению или в любом представлении, есть что-то, называемое «.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()
                }
            }
        }
    }
}

Посмотрите это видео. Там вы можете найти больше вариантов использования.

Это не дает того же результата

Subcreation 10.01.2023 01:11

Не могли бы вы уточнить?

Evgeny 10.01.2023 10:52

Экраны складываются, поэтому они заменяют исходный вид как в macOS, так и в iOS, вместо предоставления боковой панели для навигации в macOS, как это делает NavigationView. NavigationSplitView ближе, но также отображается и ведет себя иначе, чем NavigationView в macOS.

Subcreation 10.01.2023 21:28

Другие вопросы по теме