multiple cells selected on scrolling [reuse cells problem]

前端 未结 1 590
忘了有多久
忘了有多久 2021-01-17 05:10

I have a collectionViewCell which contains an image and a label. When I select a cell and scroll ahead I find other cell being selected. Also when I scroll back I find the o

相关标签:
1条回答
  • 2021-01-17 05:40

    Maintain global variable in your controller

    var mLastSelectedIndex = -1
    

    Whenever cellForRowAtIndexPath method called check if current cell is selected or not .If this is selected One update its UI. I suggest you to change selected cell UI on cell class only. This way you can easily manage cell tapping and helps you writing clean code.

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
      let cell = attachProfilesCollectionView.dequeueReusableCell(withReuseIdentifier: "attachCells", for: indexPath) as? attachUsersCell
      cell!.subscribedUserId = self.followedUsers[indexPath.row].userId
      cell?.profileNameToAttah.text = self.followedUsers[indexPath.row].fullName
      cell?.profileImageToAttch.loadImagesWithUrl(from:   self.followedUsers[indexPath.row].ImagePath)
    // here update selected index path
      if mLastSelectedIndex == indexPath.row {
          cell?.isSelected = true
      }
    else{ 
        cell?.isSelected = false
      }
    
       return cell!
    }
    

    Update last selected index on cell tapped.

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
        guard mLastSelectedIndex != IndexPath.row else{return}
        let indexpath = IndexPath(row:mLastSelectedIndex, section: 0)
        mColllectionView.cellForItem(at: indexpath)?.isSelected = !mColllectionView.cellForItem(at: indexpath)!.isSelected
        mLastSelectedIndex = IndexPath.row 
      }
    

    In your attachUsersCell.swift declare isSelected property of cell . The default value of this property is false, which indicates that the cell is not selected.

    override var isSelected: Bool{
        didSet{
            if isSelected {
    
              setSelectedUI()
    
            }
            else{
    
                setUnSelectedUI()
    
            }
    
        }
    }
    
    func setSelectedUI(){
         borderColor = UIColor.systemOrange
         borderWidth = 2
         cornerRadius = 8
          clipsToBounds = true
    }
    
    func setUnSelectedUI(){
        // reset to default ui
    }
    

    Hope this helps!

    0 讨论(0)
提交回复
热议问题