Я новый разработчик iOS, так что несите меня, если мне не хватает чего-то очевидного. Я хочу разработать приложение со скоростью, совместимой с iOS 7 и 8.UICollectionView не работает должным образом
Мой пользовательский контроллер просмотра содержит 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(), и прикосновение не регистрируется ни одним из них.
Заранее спасибо.