[英]UICollectionView don't reuse cell on ios 8 and ipad air 1
[英]UICollectionView don't reuse Cell
我的UIViewController中有一个UICollectionview。 在滚动收集视图不重用单元格。 您可以看到numberOfItemsInSection方法;
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 7
}
这是collectionViewLayout方法;
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
if(collectionView == mainCollectionView){
switch(indexPath.row){
case 0:
return CGSize(width: self.view.frame.width, height: self.view.frame.height * 0.20)
case 1:
return CGSize(width: (self.view.frame.width * 0.5) - 3, height: self.view.frame.height * 0.2)
case 2:
return CGSize(width: (self.view.frame.width * 0.5), height: self.view.frame.height * 0.2)
case 3:
return CGSize(width: self.view.frame.width, height: self.view.frame.height * 0.2)
case 4:
return CGSize(width: (self.view.frame.width * 0.6) - 3, height: self.view.frame.height * 0.2)
case 5:
return CGSize(width: (self.view.frame.width * 0.4), height: self.view.frame.height * 0.2)
case 6:
return CGSize(width: (self.view.frame.width), height: self.view.frame.height * 0.2)
default:
return CGSize(width: 0, height: 0)
}
}
}
最后一个是cellForRowAtIndexPath方法:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
if(collectionView == mainCollectionView){
var cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell
switch(indexPath.row){
case 0:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = true
cell.placeLabel.hidden = true
cell.lineView.hidden = false
case 1:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = true
cell.placeLabel.hidden = true
cell.lineView.hidden = false
case 2:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = false
cell.placeLabel.hidden = true
cell.lineView.hidden = false
case 3:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = true
cell.placeLabel.hidden = true
case 4:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = true
cell.placeLabel.hidden = true
cell.lineView.hidden = false
case 5:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = false
cell.placeLabel.hidden = true
cell.lineView.hidden = false
case 6:
cell.imageView.image = UIImage(named: imageArray[indexPath.row])
cell.clockIconImageView.hidden = true
cell.pinIconImageView.hidden = true
cell.placeLabel.hidden = true
cell.lineView.hidden = false
default:
break
}
return cell
}
您还可以看到输出:
我已经为case6 bot添加了一个断点,它没有进入该案例。 任何帮助都会很棒。
我认为处理这种情况不是一个好主意。
您应该创建一个包含对象参数的包装对象。
就您而言,它应该类似于以下内容:
class YourWrapperObject {
var image: UIImage
var clockIconHidden: Bool
var size: CGSize
// Your other vars
}
创建这些对象的数组(例如,在viewDidLoad
方法中),然后在cellForRowAtIndexPath
方法中:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell = /*get your cell using reusable identifier*/
let cellParameters = yourObjectArray[indexPath.row]
/* Then assign each parameters */
cell.imageView.image = cellParameters.image
cell.clockIconImageView.hidden = cellParameters.clockIconHidden
cell.pinIconImageView.hidden = cellParameters.pinIconHidden
cell.placeLabel.hidden = cellParameters.placeHidden
cell.lineView.hidden = cellParameters.lineHidden
/* return your cell */
return cell
}
以及您的sizeForItemAtIndexPath
方法中:
return yourObjectArray[indexPath.row].size
您的代码将更具可读性和灵活性
在主线程中重新加载UICollectionView数据解决了我的问题。 我用了:
dispatch_async(dispatch_get_main_queue()) {
mainCollectionView.reloadData()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.