Сделать многострочный компонент () с ForEach l oop? [SwiftUI] - PullRequest
0 голосов
/ 27 марта 2020

У меня есть все oop, которые отображают все мои элементы MyView ():

HStack() {
    ForEach(datastore.datacard) { data in
        MyView()
    }
}

Но я хочу иметь максимум 4 элемента MyView () на строку на моем экране. У меня есть список из 10 элементов, и я не хочу использовать ScrollView). Я не знаю, как вызвать Hstack () на каждые 4 элемента?

Возможно ли это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Сначала вам нужно разделить массив данных на куски, используя это расширение:

extension Array {
    func chunked(into size: Int) -> [[Element]] {
        return stride(from: 0, to: count, by: size).map {
            Array(self[$0 ..< Swift.min($0 + size, count)])
        }
    }
}

, затем вы можете установить размер массива:

let chunksResult = datastore.datacard.chunked(into: 4)

Для пользовательского интерфейса Попробуйте это

VStack {
      ForEach(chunksResult) { rowData in
          HStack {
              ForEach(rowData) { columnData in
                  MyView()
              }
          }
      }
  }

это пример кода, который нужно протестировать в Xcode, я просто пишу код, чтобы понять, как вы можете им управлять

0 голосов
/ 27 марта 2020

Существует инициализатор для ForEach, принимающий диапазон: https://developer.apple.com/documentation/swiftui/foreach/3364099-init

ForEach(0..<4) { index in
    MyView()
}

, если вам нужен доступ к данным, указанным в datastore.datacard внутри ForEach, вы можете получить доступ к данные через индекс:

ForEach(0..<(datastore.datacard.count < 4 ? datastore.datacard.count : 4)) { index in
     MyView(self.datastore.datacard[index])
}
...