【问题标题】:Label's text inside of UICollectionViewCell to vary depending on if statement and array's valueUICollectionViewCell 内的标签文本根据 if 语句和数组的值而变化
【发布时间】:2018-08-05 17:19:17
【问题描述】:

我有一个 UICollectionView,里面有多个单元格。每个单元格都有一个标签,其中包含以下数据。

我想做的是对于不是“A”或“B”的标签文本,我希望该值是基于单元格顺序的 Int 值。

示例

此刻的Cells Label文本:

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
    }
}

【问题讨论】:

  • 我不明白A, A, 3, B, 5, A, B 和预期结果A, A, 1, B, 2, A, B 之间的排序。你能说清楚吗?它是否保留字母,并且 Int 应该从 1 开始替换为“增加”?此外,在加载 UICollectionView 之前对其进行排序,而不是在 cellForItemAt 中进行排序,因为您每次都在做一次又一次,而它可以做一次。
  • 嗨,Larme,是的,这就是我的意思。所以目前 cell(3) 是“3”,而我希望它是“1”,而 cell(5) 是“5”,而我希望它是“2”。如果这更有意义?感谢您的帮助,如果我不够清楚,请见谅!!

标签: ios arrays swift if-statement uicollectionview


【解决方案1】:

这是一种奇怪的方式。

这段代码应该可以工作:

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()
如果它是一个字符串,则返回它(if let asString)如果它等于“A”或“B”
如果不是,让我们增加“索引”并将其作为String 返回。

建议:事先做(在加载UICollectionView之前),一次,不要在collectionView(_:cellForItemAt:),因为你每次都在做同样的计算,这是不必要的,耗时的,因为它是在主线程中完成的,您可能会看到一些延迟。
现在,如果您将sorted 保留为实例变量,则只需执行cell.valueLabel.text = sorted[indexPath.row]

【讨论】:

  • 您好 Larme,非常感谢您的回复。真的很抱歉,但我认为你误解了我的问题(完全是我的错!)。假设我的数组是[“A”,“A”,“N”,“B”,“N”,“A”,“B”],我怎样才能用你使用的索引值替换每个“N”值?这就是我想做的,但不知道如何正确地表达这个问题。谢谢!!
  • 我编辑了答案。如果是String,只需检查“A”或“B”。但是你的数组只有字符串吗?因为如果是这样的话,那就更简单了,不需要if let asString as? String部分。
  • 完美运行,非常感谢!! ?(以及其他建议!!)
【解决方案2】:
Hope this helps, have a nice day :)

类 ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBOutlet weak var collectionView: UICollectionView!

var numCount: Int = 0

var collectionDataIsNumber: [DataObject] = [DataObject(letter: "A", hasNumber: false),
                                            DataObject(letter: "C", hasNumber: true),
                                            DataObject(letter: "B", hasNumber: false),
                                            DataObject(letter: "J", hasNumber: false),
                                            DataObject(letter: "K", hasNumber: true)]

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return collectionDataIsNumber.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let data = collectionDataIsNumber[indexPath.row]

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! DataCell

    if data.hasNumber{
        numCount += 1
        cell.valueLabel.text = numCount.description
    }else{
        cell.valueLabel.text = data.letter
    }

    return cell
}
}

class DataCell: UICollectionViewCell {
@IBOutlet weak var valueLabel: UILabel!
}

class DataObject{
var letter: String = ""
var hasNumber: Bool = false

init(letter: String, hasNumber: Bool) {
    self.letter = letter
    self.hasNumber = hasNumber
}
}

【讨论】:

  • 如果向下滚动,然后向上滚动,您可能会遇到问题。
  • 你说得对,谢谢你的指出,无论如何你的答案要好得多,我只是想分享另一个选项,这显然失败了 XD,但可以修复,但既然没有必要,让坚持你的答案
猜你喜欢
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多