Вам действительно не следует добавлять обратную ссылку из ячейки в CollectionView как iVar или свойство, потому что вы получите действительно (действительно) плохую перекрестную ссылку (objA указывает на objB, а objB указывает на objA). Помимо незначительных проблем, таких как ошибки компиляции (которые могут быть плохо исправлены с помощью операторов @class
), это также приводит к серьезным проблемам, таким как невыделяемые объекты, утечки памяти, зомби и так далее.
Эмпирическое правило:
родители знают о своих детях, но дети не должны знать о своих родителях.
Другими словами: CollectionView знает свои ячейки, но ячейки не должны знать свои CollectionView.
Возможные решения
переделайте свою задачу и свое решение. Возможно, добавьте распознаватель жестов касания в collectionView, а не в ячейку. Существует -indexPathForItemAtPoint: чтобы дать вам выбранную ячейку.
Если вам абсолютно необходима обратная ссылка: определите протокол и используйте делегат. Это распространенный шаблон проектирования в Cocoa/Cocoa Touch. Вы должны прочитать о шаблоне проектирования делегата, но вкратце, вот как вы это делаете:
определите протокол в вашей ячейке (помните, ячейка не знает о типе родителя, определяя этот протокол, она просто точно знает, что в «родителе» есть один или несколько методов)
// in cell.h
@protocol MyCellProtocol
- (IBAction)doSomething:(id)sender;
@end
добавьте делегат типа id (это означает, что это может быть любой объект, если он соответствует протоколу. Другими словами: это будет ваш collectionView, но вам не нужно иметь ссылку на него!
// in cell.h
@property (assign) id<MyCellProtocol> cellDelegate;
теперь вы можете вызвать делегата в своей ячейке:
// in cell.m, some method:
[self.cellDelegate doSomething:nil];
наконец, вам нужно установить делегата. Когда вы создаете/настраиваете свою ячейку в UICollectionViewController, установите свой контроллер в качестве делегата:
// in collectionViewController.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell =
[self.collectionView dequeueReusableCellWithReuseIdentifier:@"myCell"
forIndexPath:indexPath];
cell.cellDelegate = (id<MyCellProtocol>)self;
person
auco
schedule
04.10.2013