#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 хорошей практикой? Я имею в виду, есть ли что-то плохое в этом подходе? Спасибо за ответ кстати