UICollectionView 没有按预期工作

UICollectionView not working as intended

我是一名新的 iOS 开发人员,如果我遗漏了一些明显的东西,请多多包涵。我想用 swift 开发一个具有 iOS 7 和 8 兼容性的应用程序。

我的自定义视图控制器包含一个 UICollectionView 和一个 UITableView。当用户在 Collection 视图中选择一个单元格时,将对 table 视图进行适当的更改。我使用如下所示的自定义 UICollectionViewCell。

class CategoryCollectionViewCell: UICollectionViewCell {
  @IBOutlet weak var imageView:UIImageView!
  @IBOutlet weak var textView:UILabel!

  var categoryInfo: String!
}

此外,这是视图控制器的实现:

class FeedViewController: MainPagesViewController, UITableViewDelegate, UITableViewDataSource, UICollectionViewDataSource, UICollectionViewDelegate {

    @IBOutlet weak var tableView:UITableView!
    @IBOutlet weak var collectionView:UICollectionView!

    var shownData:[String] = []
    var selectedCell: String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    self.shownData = self.collectionData(self.selectedCell)
    self.collectionView.registerNib(UINib(nibName: "CategoryCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "CategoryCells")
    self.collectionView.allowsMultipleSelection = true
}

//    MARK: Collection View
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CategoryCells", forIndexPath: indexPath) as CategoryCollectionViewCell
    cell.layer.cornerRadius = 5.0
    cell.clipsToBounds = true
    if indexPath.item == 0 {
        cell.textView.text = ""
        cell.imageView.image = UIImage(named: "back")
        cell.userInteractionEnabled = false
        return cell
    }
    cell.imageView.image = nil
    cell.categoryInfo = self.shownData[indexPath.item - 1]
    cell.textView.text = cell.categoryInfo
    return cell;
}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.deselectItemAtIndexPath(indexPath, animated: false)
    if(indexPath.item == 0){
        self.shownData = self.collectionData("back")
        collectionView.reloadData()
        self.refreshTableView()
    }
    else {
        self.shownData = self.collectionData(self.selectedCell)
        collectionView.reloadData()
        self.refreshTableView()
    }
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.shownData.count + 1
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    if (indexPath.item == 0){
        return CGSize(width: 30, height: 30)
    }
    var sizingCell = (UINib(nibName: "CategoryCollectionViewCell", bundle: nil).instantiateWithOwner(nil, options: nil))[0] as CategoryCollectionViewCell
    sizingCell.textView.text = self.shownData[indexPath.item - 1]
    sizingCell.setNeedsLayout()
    sizingCell.layoutIfNeeded()
    let size = sizingCell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
    return CGSize(width: size.width + 1, height: 30)
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, estimatedItemSize indexPath: NSIndexPath) -> CGSize {
    if (indexPath.item == 0){
        return CGSize(width: 30, height: 30)
    }
    return CGSize(width: 80, height: 30)
}



}

collectionData() 是一个函数,用于设置要在集合视图单元格中显示的标签。 refreshTableView() 对 table 视图进行更改。 MainPagesViewController 是一个带有一些变量的简单 UIViewController。此外,集合视图使用水平滚动方向的流布局。

当应用程序在 iPhone 模拟器中测试时,第一次触摸单元格调用 didSelectItemAtIndexPath()。但是在使用 reloadData() 重新加载集合视图后,只有一些单元格调用了 didSelectItemAtIndexPath() 并且触摸没有注册到所有单元格。

提前致谢。

刚刚发现当在cellForItemAtIndexPath 中禁用用户交互时,将对出列的可重用单元格禁用交互。我只需要为出队的可重用单元重置用户交互。