UICollectionView - Horizo​​ntal Tableview - Swift - 在每行中显示不同的图像

时间:2016-06-22 22:28:27

标签: swift uicollectionview tableview

我在TableView中放置了一个UICollectionView来显示图像 水平。我想每行只添加4个图像,当然这些图像在每一行中应该是不同的。我的代码是如此

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 4;
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("imageCell", forIndexPath: indexPath) as! ImageCell

    var imageName:String?

    if(Constants.counter >= 1 && Constants.counter <= 4) {
        imageName = DataSource.eyeColorArray.objectAtIndex(indexPath.row) as? String
    }

    if(Constants.counter >= 5 && Constants.counter <= 8) {
        imageName = DataSource.maskArray.objectAtIndex(indexPath.row)as? String
    }

    var concurrentQueue : dispatch_queue_t?
    concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    dispatch_async(concurrentQueue!) {
        let img = UIImage(named: imageName!)
        cell._imgView.image = img
    }
    Constants.counter = Constants.counter + 1
    print(Constants.counter)
    return cell
}

我的尝试是使用计数器变量 Constants.counter ,这有助于我每4步从不同的数组中选择图像。所以这意味着..在开始时,我的第一行从 DataSource.eyeColorArray 获取图像。在我的第二行中,图像是从 DataSource.maskArray 中选取的。

在这种情况下的问题是,我的第一行和第二行填充了从最后一个数组中拾取的图像(DataSource.maskArray)

有什么想法吗? 最好的祝福, 纳扎尔

1 个答案:

答案 0 :(得分:0)

我并不完全确定是什么触发了您看到的行为,但您在Counter处使用此处会对collectionView:cellForItemAtIndexPath:的调用方式做出一些不安全的假设,我认为您应该避免这种情况方法

当您加载并滚动浏览集合视图时,可以为显示的每个索引路径调用cellForItemAtIndexPath。每个索引路径将多次调用它。它可以按升序或降序调用索引路径,以任意顺序为一组索引路径调用它是有效的。

您的Counter会导致这些单元格的内容取决于cellForItemAtIndexPath的调用顺序和次数。如果您改为根据索引路径参数的节和行选择图像,则可以实现更安全,更可预测的实现。