我有一个包含多个单元格的UICollectionView。每个单元格都有一个包含以下数据的标签。
我想做的是,对于不是“A”或“B”的标签文本,我希望该值是基于单元格顺序的Int值。
例子
当前单元格标记文本:
A,A,3,B,5,A,B
我想要什么:
A,A,1,B,2,A,B
非常感谢您的帮助,非常感谢!!
代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! DataCell
let integerArray = [Int](1...10)
let sortedCellData = cellData.sorted { $0.key < $1.key}
if String(Array(sortedCellData)[indexPath.row].value) == "A" {
cell.valueLabel.text = "A"
} else if String(Array(sortedCellData)[indexPath.row].value) == "B" {
cell.valueLabel.text = "B"
} else {
cell.valueLabel.text = String(integerArray[indexPath.row])
}
return cell
}
}
最佳答案
真奇怪。
此代码应该可以工作:
let array: [Any] = ["A", "A", 3, "B", 5, "A", "B", "N"]
var index = 0
let sorted = array.compactMap { (element) -> Any? in
if let asString = element as? String, (asString == "A" || asString == "B") {
return asString
} else {
index = index + 1
return String(index)
}
}
print("array: \(array)")
print("sorted: \(sorted)")
输出:
$>array: ["A", "A", 3, "B", 5, "A", "B", "N"]
$>sorted: ["A", "A", "1", "B", "2", "A", "B", "3"]
逻辑:
迭代元素:
compactMap()
如果它是一个字符串,如果它等于“a”或“B”,则返回它(the
if let asString
)如果不是,让我们增加“索引”并将其作为
String
返回。建议:在手动操作之前(加载
UICollectionView
之前)执行一次,不要在collectionView(_:cellForItemAt:)
中执行一次,因为每次执行的计算都是相同的,这是不必要的、耗时的,而且由于是在主线程中执行的,因此可能会看到一些延迟。现在,如果您保持
sorted
作为实例变量,则只需执行cell.valueLabel.text = sorted[indexPath.row]