2015-03-10 14 views
0

Я новый разработчик 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(), и прикосновение не регистрируется ни одним из них.

Заранее спасибо.

ответ

0

Только что выяснилось, что при взаимодействии с пользователем в cellForItemAtIndexPath взаимодействие будет отключено для ячейки с повторным использованием повторно. Мне просто нужно было сбросить взаимодействие с пользователем для ячейки повторно используемой повторно.

Смежные вопросы