集合视图显示在滚动时选择的单元格尚未被选中

时间:2015-11-28 18:45:14

标签: ios swift uicollectionviewcell collectionview

在我的CollectionView中,我希望用户选择单元格。如果选择了单元格,则应显示图像,标签应消失。用户还应该能够再次取消选择单元格,然后再次选择它(取消选择后的选择此时不起作用)。 标签的文本来自一个数组并正确显示。 但是在选择单元格时,然后选择滚动其他单元格。当再次向后滚动其他单元格时,从未触摸过的选定单元格。我认为必须重复使用单元格,所以我已经在单元格的类中添加了prepareForReuse方法。

我还希望存储用户关闭应用时选择的单元格,并在再次打开时将其显示为已选中。

另一个问题是,当我还选择某个其他单元格时,我希望它只能选择一个单元格。这样做的最佳方式是什么?

class CollectionViewController: UICollectionViewController {

var array:[String] = []

var selectedIndexes:NSMutableDictionary = NSMutableDictionary()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    doors = ["1","2","3"]

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

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

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

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

    var Label = cell.viewWithTag(1) as! UILabel

    Label.text = array[indexPath.row]

    let keystring = String(format:"%i", indexPath.row)

    if (self.selectedIndexes[keystring] != nil) {

        cell.myLabel.hidden = true
        cell.myImageView.image = UIImage(named:"1")!

    }
    else {

    }

    return cell
}

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    let keystring = String(format:"%i", indexPath.row)

    if (self.selectedIndexes[keystring] != nil) {

        let cell = collectionView.cellForItemAtIndexPath(indexPath) as! MyCollectionViewCell

        cell.myLabel.hidden = false
        cell.myImageView.image = nil

    }
    else {

        selectedIndexes.setObject(keystring, forKey: keystring)

        let cell = collectionView.cellForItemAtIndexPath(indexPath) as! MyCollectionViewCell

        cell.myLabel.hidden = true
        cell.myImageView.image = UIImage(named:"1")!


    }

CollectionViewCell的类:

class MyCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myImageView: UIImageView!

override func prepareForReuse() {
    super.prepareForReuse()

    self.myImageView.image = nil
    self.myLabel.hidden = false

1 个答案:

答案 0 :(得分:0)

重复使用单元格(这极大地优化了表格滚动速度等),正如您所描述的那样,这是您的“问题”。 您所要做的就是在加载它们的时候“重新初始化”单元格上的文本和标签等。最好的办法是将您的单元格内容放在一个对象中,并将这些对象放在一个数组中。当我加载单元格时,然后使用cellForRowAtIndexPath(通常是默认实现中的indexPath.row)根据数组中对象的值设置值