У меня возникла странная проблема с использованием Xib для UICollectionViewCells. Проблема в том, что создается дополнительный вид, который, кажется, стоит на вершине всего, делая мои жесты и IBActions бесполезными.Дополнительный просмотр ввода в UICollectionView, загруженного из Xib
Вот мои настройки:
У меня есть UIViewController с UICollectionView в нем.
В раскадровке, то UICollectionView имеет одну ячейку, класса «MyCell», с повторным использованием идентификатора «ячейки»
В
cellForItemAtIndexPath
, я только возвращает результат[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]
. Я также запрограммировал 30 пунктов вnumberOfItemsInSection
.
Это все. Кроме того, у меня есть MyCell.h, MyCell.m и MyCell.xib.
XIB содержит один UIButton, чей Touch Up Inside событие должно вызвать
buttonPressed
IBAction. Само представление установлено в класс MyCell, а тег установлен на 123 (мы поймем, почему ниже).В MyCell.m, я переделал
awakeAfterUsingCoder
, чтобы вернуть[MyCell initView:self]
. ОпределениеinitView
находится внизу. Но он в основном загружает представление из Xib.
Всё.
Когда я запускаю приложение, отображаются 30 ячеек, все с их кнопкой, но когда кнопка нажата, ничего не происходит. После много исследования, я обнаружил, что внутри ячейки добавлен дополнительный UIView, который находится поверх кнопки, и он покрывает всю вещь.
Если я добавлю для петли ниже внутри awakeAfterUsingCoder
, тогда кнопка снова работает.
- (MyCell *)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
MyCell *cell = [MyCell initView:self];
for(UIView *v in cell.subviews){
if(![v isKindOfClass:[UIButton class]]) [v removeFromSuperview];
}
return cell;
}
Мой вопрос: что это за точка зрения, и почему он там? Несмотря на то, что я могу заставить все работать, удалив эту точку зрения, это похоже на хак.
Спасибо! И я могу ответить на любые другие вопросы, если это необходимо.
+ (id)initView:(UIView *)viewToInit
{
UIView *viewToReturn;
if(viewToInit.tag != 123){
//If we're in the storyboard codepath
//Initialize from the xib.
//If the code below is failing, we probably forgot the 666 tag :/
viewToReturn = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([viewToInit class])
owner:nil
options:nil] firstObject];
//copy frame, autoresizing, and layour items.
viewToReturn.frame = viewToInit.frame;
viewToReturn.autoresizingMask = viewToInit.autoresizingMask;
viewToReturn.translatesAutoresizingMaskIntoConstraints = viewToInit.translatesAutoresizingMaskIntoConstraints;
for (NSLayoutConstraint *constraint in viewToInit.constraints){
id firstItem = constraint.firstItem;
if (firstItem == viewToInit){
firstItem = viewToReturn;
}
id secondItem = constraint.secondItem;
if (secondItem == viewToInit){
secondItem = viewToReturn;
}
[viewToReturn addConstraint:[NSLayoutConstraint constraintWithItem:firstItem
attribute:constraint.firstAttribute
relatedBy:constraint.relation
toItem:secondItem
attribute:constraint.secondAttribute
multiplier:constraint.multiplier
constant:constraint.constant]];
}
}else{
//otherwise do nothing and just return what was passed in
viewToReturn = viewToInit;
}
return viewToReturn;
}