我是一名新的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(),并且没有在所有单元中注册触摸。
提前致谢。
答案 0 :(得分:0)
刚发现在cellForItemAtIndexPath中禁用用户交互时,将对出列的可重用单元禁用交互。我只需要为出列的可重用单元重置用户交互。