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 中禁用用户交互时,将对出列的可重用单元格禁用交互。我只需要为出队的可重用单元重置用户交互。
我是一名新的 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 中禁用用户交互时,将对出列的可重用单元格禁用交互。我只需要为出队的可重用单元重置用户交互。