[英]UICollectionView.reloadData or UICollectionView.deleteItemsAtIndexPaths makes cell hidden but still clickable
[英]UICollectionView.reloadData() changes cell order | iOS Swift
因此,我正在使用一个简单的UICollectionView,按X行3列,其中X由变量matchsFromSelectedSession.count + 1设置。这是我用于collectionView的委托函数:
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 3
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let cellHeight = 15.0 as CGFloat
return CGSizeMake(collectionView.bounds.size.width/3, cellHeight)
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return matchesFromSelectedSession.count + 1
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let reuseIdentifier = "MatchCollectionViewCell"
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MatchCollectionViewCell
cell.matchCollectionLabel = UILabel(frame: CGRectMake(0,0,collectionView.bounds.width/3 - 3.0,15))
cell.matchCollectionLabel.textColor = UIColor.blackColor()
cell.systemLayoutSizeFittingSize(cell.frame.size, withHorizontalFittingPriority: UILayoutPriorityDefaultHigh, verticalFittingPriority: UILayoutPriorityDefaultLow)
cell.matchCollectionLabel.font = UIFont(name: "Helvetica Neue", size:12)
if indexPath.section == 0 {
switch indexPath.row {
case 0:
cell.matchCollectionLabel.text = "Match #"
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
cell.matchCollectionLabel.textAlignment = NSTextAlignment.Right
break
case 1:
cell.matchCollectionLabel.text = "Record"
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
cell.matchCollectionLabel.textAlignment = NSTextAlignment.Center
break
case 2:
cell.matchCollectionLabel.text = "Outcome"
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
break
default:
cell.matchCollectionLabel.text = ""
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
break
}
} else {
switch indexPath.row {
case 0:
cell.matchCollectionLabel.text = "\(indexPath.section)"
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
cell.matchCollectionLabel.textAlignment = NSTextAlignment.Right
break
case 1:
cell.matchCollectionLabel.text = matchesFromSelectedSession[indexPath.section - 1].matchRecord()
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
cell.matchCollectionLabel.textAlignment = NSTextAlignment.Center
break
case 2:
let outcome = matchesFromSelectedSession[indexPath.section - 1].matchOutcome()
switch outcome {
case "W":
cell.matchCollectionLabel.text = "Win"
cell.matchCollectionLabel.textColor = UIColor.greenColor()
break
case "D":
cell.matchCollectionLabel.text = "Draw"
cell.matchCollectionLabel.textColor = UIColor.blueColor()
break
case "L":
cell.matchCollectionLabel.text = "Loss"
cell.matchCollectionLabel.textColor = UIColor.redColor()
break
default:
cell.matchCollectionLabel.textColor = UIColor.blackColor()
break
}
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
break
default:
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
cell.matchCollectionLabel.text = ""
break
}
}
//add subview if new cell otherwise tag cell to know to reuse next time
if cell.tag != 19 {
cell.addSubview(cell.matchCollectionLabel)
}
cell.tag = 19
return cell
}
我使用的自定义单元MatchCollectionViewCell仅包含一个标签matchCollectionLabel,就是这样。 我在视图的viewDidAppear函数中使用self.matchCollectionView.reloadData()来查看辅助视图何时更改表并将其退回到原始视图。
第一次使用后,我会标记单元格,因为我不会在每个viewDidAppear之后不断向单元格中添加不必要的子视图。
初始设置后,该表看起来不错,但是在调用reloadData之后,collectionView的单元格顺序被更改并混乱。 如果我编辑单元格数,则reloadData()更新以正确显示单元格数更改,但是单元格的顺序仍然不正确。
这是reloadData之前和之后的图片
任何帮助将不胜感激! 谢谢!
您每次都在创建一个新标签。 如果标记不是19,则仅将其添加为子视图,但始终分配新标签。
这意味着,当您重复使用单元格时,您将更新一个新标签,而不是已添加到该单元格的标签,因此您的更改不可见。
您可以将标记检查移至函数顶部,并使用它来控制标签的分配,或者将matchCollectionLabel
定义为可选,然后可以将其检查为nil
:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let reuseIdentifier = "MatchCollectionViewCell"
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MatchCollectionViewCell
if cell.matchCollectionLabel == nil {
cell.matchCollectionLabel = UILabel(frame: CGRectMake(0,0,collectionView.bounds.width/3 - 3.0,15))
cell.matchCollectionLabel!.textColor = UIColor.blackColor()
cell.systemLayoutSizeFittingSize(cell.frame.size, withHorizontalFittingPriority: UILayoutPriorityDefaultHigh, verticalFittingPriority: UILayoutPriorityDefaultLow)
cell.matchCollectionLabel!.font = UIFont(name: "Helvetica Neue", size:12)
cell.addSubview(cell.matchCollectionLabel!)
}
if indexPath.section == 0 {
switch indexPath.row {
case 0:
cell.matchCollectionLabel!.text = "Match #"
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Right
break
case 1:
cell.matchCollectionLabel!.text = "Record"
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Center
break
case 2:
cell.matchCollectionLabel!.text = "Outcome"
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
break
default:
cell.matchCollectionLabel!.text = ""
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
break
}
} else {
switch indexPath.row {
case 0:
cell.matchCollectionLabel!.text = "\(indexPath.section)"
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Right
break
case 1:
cell.matchCollectionLabel!.text = matchesFromSelectedSession[indexPath.section - 1].matchRecord()
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
cell.matchCollectionLabel!.textAlignment = NSTextAlignment.Center
break
case 2:
let outcome = matchesFromSelectedSession[indexPath.section - 1].matchOutcome()
switch outcome {
case "W":
cell.matchCollectionLabel!.text = "Win"
cell.matchCollectionLabel!.textColor = UIColor.greenColor()
break
case "D":
cell.matchCollectionLabel!.text = "Draw"
cell.matchCollectionLabel!.textColor = UIColor.blueColor()
break
case "L":
cell.matchCollectionLabel!.text = "Loss"
cell.matchCollectionLabel!.textColor = UIColor.redColor()
break
default:
cell.matchCollectionLabel!.textColor = UIColor.blackColor()
break
}
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
break
default:
if indexPath.section%2 == 0 {
cell.backgroundColor = ImageEditor.colorWithHexString("EFEFF4")
}
cell.matchCollectionLabel!.text = ""
break
}
}
return cell
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.