UICollectionView无法正常工作

时间:2015-03-10 11:38:27

标签: ios swift uicollectionview

我是一名新的iOS开发人员,如果我错过了一些明显的东西,请耐心等待。我想开发一个具有iOS 7和8兼容性的swift应用程序。

我的自定义视图控制器包含UICollectionView和UITableView。当用户在“集合”视图中选择单元格时,将对表视图进行适当的更改。我使用如下的自定义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()对表视图进行更改。 MainPagesViewController是一个带有一些变量的简单UIViewController。此外,集合视图使用具有水平滚动方向的流布局。

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

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