Swift 2,UICollectionView没有使用正确的标识符正确地出列

时间:2016-08-01 01:24:16

标签: ios swift xcode uicollectionview

这是Xcode 7.3.1,swift 2

我有一个带有UICollectionView的视图控制器,它是UIView的子视图。集合视图的单元格具有标识符" NumberCell"。

这是我的ViewController中的cellForItemAtIndexPath

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("NumberCell", forIndexPath: indexPath) as? NumberCell {
        let currentNumber = indexPath.row + 1
        cell.configureCell(currentNumber)

        cell.numberBtn.tag = currentNumber;
        cell.numberBtn.addTarget(self, action: #selector(ViewController.playerClickedButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)

        return cell
    } else {
        return UICollectionViewCell()
    }
}

这是我的手机" configureCell" (不是它应该重要)

func configureCell(cellNumber: Int) {
    backNumberLbl.text = "\(cellNumber)"
    frontNumberLbl.text = "\(cellNumber)"
    self.tag = cellNumber
    numberBtn.tag = cellNumber
}

我遇到了视觉问题,而不是崩溃。当我滚动时,新单元格显示已从屏幕滚动的单元格的特征。我已经改变了标识符,但仍然破碎了。我把它改回来了,还是坏了。我已经在cell.configureCell(currentNumber)下注释掉了其他代码行。

我已经搜遍过,无法解决这个问题。

感谢StackOverflow社区!

2 个答案:

答案 0 :(得分:0)

由于我的声誉,我无法添加评论。但我之前遇到过这样的问题。

  1. 如果您使用代码,请检查您是否在public func registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String)中调用了方法viewDidLoad

  2. 如果您使用Nib,请检查您是否调用了方法registerNib(nib: UINib?, forCellWithReuseIdentifier identifier: String)

  3. 如果您使用情节提要,请不要调用方法public func registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String)registerNib

  4. 有关详细信息,如果损坏(I've changed the identifier, still broken)表示崩溃,则最好发布控制台日志。

    更新: 我根据你的代码得到了预期的结果。这是我的代码:

    class ViewController: UIViewController {
    
        @IBOutlet weak var collectView: UICollectionView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
    
    }
    
    extension ViewController : UICollectionViewDelegate, UICollectionViewDataSource {
    
        func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 50
        }
    
        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("NumberCell", forIndexPath: indexPath) as? NumberCell {
                let currentNumber = indexPath.row + 1
                cell.configureCell(currentNumber)
                cell.numberBtn.tag = currentNumber;
                cell.numberBtn.addTarget(self, action: #selector(ViewController.playerClickedButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    
                return cell
            } else {
                return UICollectionViewCell()
            }
        }
    
        func playerClickedButton(button: UIButton) {
            print(button.tag)
        }
    
    }
    
    class NumberCell: UICollectionViewCell {
    
        @IBOutlet weak var backNumberLbl: UILabel!
    
        @IBOutlet weak var frontNumberLbl: UILabel!
    
        @IBOutlet weak var numberBtn: UIButton!
    
        func configureCell(cellNumber: Int) {
            backNumberLbl.text = "\(cellNumber)"
            frontNumberLbl.text = "\(cellNumber)"
            self.tag = cellNumber
            numberBtn.tag = cellNumber
        }
    }
    

    enter image description here

答案 1 :(得分:-1)

让currentNumber = indexPath.row + 1

cell.configureCell(currentNumber)

这里,您要为当前的indexPath出列单元格,但是尝试配置尚未出列的下一个单元格。