Линейная / условная навигация с помощью одной кнопки SwiftUI

#swift #view #navigation #swiftui

#swift #Вид #навигация #swiftui

Вопрос:

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

В настоящее время индикатор страницы несколько точен (корректен при загрузке на новую страницу), однако я не могу заставить навигационную ссылку работать из этой структуры.

Функция находится в своем собственном файле и вызывается в другом представлении с помощью Foo(progress: Index)

     var Index : Int = 1

    struct PageCounter: View {
    
        let progress: Int
        init(progress: Int) {
            self.progress = progress
        }
        var body: some View {
            HStack {
                Button(action: { if Index > 1 { Index -= 1 } } ) {
                Image(systemName: "lessthan") }  
                Spacer()

                ForEach(1 ..< 8) {value in
                    if value-1 < self.progress {
                        Image(systemName: "circle.fill")                        
                    } else {
                        Image(systemName: "circle")
                    }
                }

                Spacer()

                NavigationLink(destination: getDestination()) {                
                Button(action: { if Index < 8 { Index  = 1 } } ) {
                Image(systemName: "greaterthan") } }
            }
        }

    func getDestination() -> AnyView {
        if index == 1 {
            return AnyView(View1())
        } else if Index == 2 {
            return AnyView(View2())
        } else if Index == 3 {
            return AnyView(View3())
        } else if Index == 4 {
            return AnyView(View4())
        }  else {
            return AnyView(MainPage())
        }
      }
    }
  

Индикатор выглядит примерно таквведите описание изображения здесь, однако нажатие стрелок в настоящее время, похоже, ничего не делает

Как я могу заставить это правильно работать? И есть ли лучший способ добиться этого, чем я сейчас пытаюсь?

Ответ №1:

Создание состояний progress и index struct, а затем использование навигационного представления с тегом и селектором с использованием состояний позволяет правильно перемещаться, а не зависать.

     struct PageCounter: View {
        
        @State private var progress: Int?
        @State private var index: Int = 1

        var body: some View {
            HStack {
                
                NavigationLink(destination: getDestination(), tag: index, selection: $progress) {
                Button(action: { if index > 1 { 
                    self.progress -= 1
                    self.progress = self.index } } ) {
                Image(systemName: "lessthan") } 
  

Создание состояний переменных и использование тегов и аргументов выбора навигационной ссылки позволяют адаптивно обновлять ее на основе значений, а не полагаться на внешнее обновление перед принятием мер