Множественный список с помощью SwiftUI

#ios #arrays #swift #swiftui

Вопрос:

Допустим, у меня есть массив массивов, таких как:

 var arrays = [["one", "two", "three", "Four"], ["four", "five", "six"]]
 

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

 Example 1: one -> (NavigationLink) two -> (NavigationLink) three -> (NavigationLink) Four. 

Example 2: four -> (NavigationLink) five -> (NavigationLink) six.
 

Каждая стрелка представляет собой навигационную ссылку между каждым списком.

Вот что я пробовал до сих пор:

 struct ContentView: View {

    let arrays = [["A", "B", "C", "D"], ["E", "F", "G", "H"]]

    var body: some View {
        NavigationView {
            List {
                ForEach(arrays, id: .self) { item in
                    NavigationLink( destination: DestinationView(items: item)) {
                        Text(item.first!).font(.subheadline)
                    }
                }
            }
            .navigationBarTitle("Dash")
        }
    }
}

struct DestinationView : View {
    
    var items: [String]
    
    var body: some View {
        List {
            ForEach(items, id: .self) { item in
                NavigationLink( destination: DestinationView(items: items)) {
                    Text(item).font(.subheadline)
                }
            }
        }
    }
}




     
 

Комментарии:

1. В вашем примере у вас есть DestinationView ссылка на другую DestinationView . Означает ли это, что может существовать произвольное количество уровней данных? Потому что набор примеров имеет глубину всего 2 уровня.

2. @jnpdx Да, именно так. Каждый подмассив не обязательно будет равным. Как ты думаешь, как я мог бы этого добиться?

3. Ах, я неправильно истолковал. Мне все еще немного неясно, каков желаемый результат для каждого шага списка, но я дал ответ. Буду рад скорректировать, если вы проясните цель того, как должен выглядеть каждый этап.

Ответ №1:

Вы можете сделать это следующим образом, разрезая массив каждый раз, когда вы передаете его в DestinationView

 import SwiftUI

struct ContentView: View {

    let arrays = [["A", "B", "C", "D"], ["E", "F", "G", "H"]]

    var body: some View {
        NavigationView {
            List {
                ForEach(arrays, id: .self) { item in
                    NavigationLink( destination: DestinationView(items: Array(item[1..<item.count]))) {
                        Text(item.first!).font(.subheadline)
                    }
                }
            }
            .navigationBarTitle("Dash")
        }
    }
}

struct DestinationView : View {
    
    var items: [String]
    
    var body: some View {
        List {
            if self.items.count > 0 {
                NavigationLink( destination: DestinationView(items: Array(items[1..<items.count]))) {
                    Text(items[0]).font(.subheadline)
                    }
            }
        }
    }
}
 

Комментарии:

1. Является ли вызов DestinationView из DestinationView хорошей практикой? Я имею в виду, есть ли что-то плохое в этом подходе? Спасибо за ответ кстати