Показатель сетки SwiftUI вне диапазона - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь это решение использования макета Grid.

Мы хотим динамически отображать элементы массива в сетке, и если Array.count Changed выдает ошибку с индексом вне диапазона, появляется и приложение вылетает.

Как это исправить?

var totalrows: Int{
    let t = Double(self.cards.count) / Double(self.cols)
    return Int(round(t))
}


var cols: Int{
    let col = self.verticalSizeClass == .compact ? 4 : 2
    return col
}



func colrow (col: Int , row: Int) -> Int{
    var colrow = 0
        colrow = (row * self.cols) + col
    return colrow
}






let cards = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"]



var body: some View {

        VStack{
            ForEach(0..<self.totalrows,id:\.self) { row in
                HStack {
                    ForEach(0..<self.cols,id:\.self) { column in
                        Text(self.cards[self.colrow(col: column, row: row)])
                    }


                }
               }
    }
}

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Простой способ избежать indexOutOfBounds - просто проверить, не выходит ли индекс за пределы границ, перед выполнением операции ...

Поэтому внесите это изменение:

ForEach(0..<self.cols,id:\.self) { column in
    let card = self.colrow(col: column, row: row)
    if (card < self.cards.count) {
        Text(self.cards[card])
    }
}

Это будет оставьте свой последний ряд потенциально незаполненным, но он не должен обработать sh

0 голосов
/ 07 января 2020

То, как вы cols возвращаете либо 4, либо 2, вам нужно иметь четное count в cards.

Я бы решил эту проблему, всегда проверяя count из cards и добавление пустого элемента в конец, если он еще не четный.

Пример:

//only even numbers count
var cards = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"]

if (cards.count % 2) != 0 {
    cards.add("")
}
...