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

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
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

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