0

У меня возникла странная проблема с использованием 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; 
    } 

ответ

0

ОК, так что после долгого времени иметь неприятный хак в там, чтобы обойти эту проблему, я понял это.

Проблема в том, что contentView UICollectionViewCell вставлен поверх моих представлений. Это очень странно для меня, потому что этого не происходит с UITableViewCells, которые также имеют представление контента.

То, что я сделал тогда, заключалось в том, чтобы поместить все в представление «контейнер», а затем переместить этот вид контейнера в contentView на init, и это позаботилось о проблеме.

Я до сих пор не понимаю ПОЧЕМУ это происходит.Мне кажется, что все мои взгляды должны быть добавлены в contentView (например, в ячейках таблицы), но по крайней мере теперь я могу обойти его.