2017-02-17 130 views
0

我有一个UICollectionView,它使用定制的xib文件作为它的单元格。在单元格中,我有一个ImageView复选框。我想在录制时更改ImageView1的图像。我试着下面的代码片段,但是,它不适合我在UICollectionViewCell上点击更改ImageView图像

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! V_Cell 

    if show_delete == true { 
     cell.img_delete.image = UIImage(named: "checked") 
    } 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! V_Cell 

    // Configure the cell 

    let data = valves_[indexPath.row] 
    cell.v_name.text = data 

    if show_delete == true { 
     cell.img_delete.isHidden = false 
    } else if show_delete == false { 
     cell.img_delete.isHidden = true 
    } 

    return cell 
} 

工作在这个代码中,我试图改变的ImageView图像中didSelectItemAt

我的自定义xib文件如下。

enter image description here

请提出一个方法,使其工作。谢谢。

+0

我可以知道您是否尝试过我的解决方案? – KrishnaCA

+0

@KrishnaCA我通过对您的建议进行微调来解决问题。感谢领先。 –

+0

这几乎看起来与我的解决方案类似。但是,您不是使用完整的布尔数组,而是使用int数组来减少内存足迹。尼斯 – KrishnaCA

回答

1

对于这类问题,最好保留一个包含给定的indexpath的项目是否被选中的数组。

var checkArray: [Bool] = [Bool](repeating: false, count: numberOfRowsInCollectionView) 
// this should be the same size as number of items in collection view 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! V_Cell 
    checkArray[indexPath.row] = !checkArray[indexPath.row] // if it's true, make it false and vice versa logic 
    collectionView.reloadItems(at: [indexPath]) 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! V_Cell 

    // Configure the cell 

    let data = valves_[indexPath.row] 
    cell.v_name.text = data 

    if show_delete == true { 
     cell.img_delete.isHidden = false 
    } else if show_delete == false { 
     cell.img_delete.isHidden = true 
    } 

    if checkArray[indexPath.row] { 
     cell.img_delete.image = //image for check 
    }else { 
     cell.img_delete.image = //image for no check 
    } 

    return cell 
} 
0

最后我用下面的代码解决了它。

var checkArray = [Int]() 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    if show_delete == true { 
     if checkArray.contains(indexPath.row) { 
      let index = checkArray.index(of: indexPath.row) 
      checkArray.remove(at: index!) 
      collectionView.reloadItems(at: [indexPath]) 
     } else { 
      checkArray.append(indexPath.row) 
      collectionView.reloadItems(at: [indexPath]) 
     } 
    } 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! V_Cell 

    // Configure the cell 
    let data = valves_[indexPath.row] 
    cell.v_name.text = data 

    if show_delete == true { 
     cell.img_delete.isHidden = false 
    } else if show_delete == false { 
     cell.img_delete.isHidden = true 
    } 

    if checkArray.contains(indexPath.row) { 
     cell.img_delete.image = UIImage(named: "checked_n") 
    } else { 
     cell.img_delete.image = UIImage(named: "unchecked") 
    } 

    return cell 
} 

我把录音的元素索引放在一个数组中,并重新加载indexpath的项目。如果数组包含重新加载的索引,则它将显示复选标记,如果不包含,则删除复选标记。