2013-08-18 4 views
-2

Я использую следующий код, например, UIView, из XIB, а затем добавьте его к выбранному UITableViewCell для отображения. Когда я запускаю код и касаюсь ячейки, я могу пройти через код и увидеть, что все настроено правильно (ничего нет), и все же представление никогда не отображается.Отобразить UIView в UITableViewCell прагматично

У меня есть UIView с несколькими кнопками на нем. В Interface Builder я установил UIView для использования подкласса UIView, который в настоящий момент не имеет в нем никакого кода, кроме плиты котла, сгенерированной Xcode. Я надеюсь, кто-то может указать на очевидные ошибки, которые я сделал в использовании этого кода, чтобы заставить это работать.

Обратите внимание, что в какой-то момент у меня был UIView, отображаемый в UITalbeViewCell, но во время некоторого рефакторинга я испортил некоторые вещи и в итоге переписал код, чтобы справиться с этим. Когда это произошло, я больше не мог отображать UIView внутри ячейки.

@implementation HZRunwayViewController 
{ 
    EKEvent *currentEvent; 
    BOOL editingEvent; 
    HZEventDrawerView *eventDrawer; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Check if we are touching an event 
    if (indexPath.section == 0 && [self.eventsForCurrentDay count]) { 

     // Grab the selected cell and make sure it's an event cell 
     UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
     if ([cell isKindOfClass:[HZEventTableViewCell class]]) { 

      // Setup our event cell and our action drawer for use. 
      HZEventTableViewCell *eventCell = (HZEventTableViewCell *)cell; 

      if (!eventDrawer) { 
       eventDrawer = (HZEventDrawerView *)[[NSBundle mainBundle] loadNibNamed:@"HZEventDrawerView" owner:self options:nil][0]; 
      } 

      eventDrawer.bounds = eventCell.bounds; 
      NSLog(@"X:%f Y:%f Width: %f Height: %f", eventDrawer.bounds.origin.x, eventDrawer.bounds.origin.y, eventDrawer.bounds.size.width, eventDrawer.bounds.size.height); 
      [eventCell.contentView addSubview:eventDrawer]; 
      [eventCell bringSubviewToFront:eventDrawer]; 
      eventDrawer.hidden = NO; 
     } 
    } 
} 

Update

Для того, чтобы проверить и посмотреть, если это был мой файл XIB или суб-класс вызывает проблему, я перестал использовать его, инстанс в UIView, добавил UIButton к нему а затем добавили его в подкласс Cell.contentView. Когда я касаюсь клетки, ничего не происходит.

// Grab the selected cell and make sure it's an event cell 
     UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
     if ([cell isKindOfClass:[HZEventTableViewCell class]]) { 

      // Setup our event cell and our action drawer for use. 
      HZEventTableViewCell *eventCell = (HZEventTableViewCell *)cell; 

      if (!eventDrawer) { 
       eventDrawer = [[UIView alloc] initWithFrame:eventCell.bounds]; 
       UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(5, 5, 25, 44)]; 
       [eventDrawer addSubview:button]; 
      } 

      eventDrawer.frame = eventCell.bounds; 
      NSLog(@"X:%f Y:%f Width: %f Height: %f", eventDrawer.bounds.origin.x, eventDrawer.bounds.origin.y, eventDrawer.bounds.size.width, eventDrawer.bounds.size.height); 
      [eventCell.contentView addSubview:eventDrawer]; 
      [eventCell bringSubviewToFront:eventDrawer]; 
      eventDrawer.hidden = NO; 
     } 
+0

Я хотел также добавить результаты печати NSLog. Значения X и Y равны 0: 0, а значения Width и Height равны 320: 46. –

ответ

0

Вместо eventDrawer.bounds = eventCell.bounds; попробовать eventDrawer.frame = eventCell.bounds;

bounds из точки зрения рассматриваются изнутри, так что начало координат будет 0, 0. Однако frame из зрения относительно его SuperView, поэтому происхождение может отличаться от 0, 0.

+0

Я сделал предложенное изменение, однако UIView все еще не отображается. –

0

Попробуйте установить в пользовательском UIView в XIB набор файлов класса HZEventDrawerView и изменения линии

eventDrawer = (HZEventDrawerView *)[[NSBundle mainBundle] loadNibNamed:@"HZEventDrawerView" owner:self options:nil][0]; 

На:

eventDrawer = [[HZEventDrawerView alloc] initWithNibNamed:@"HZEventDrawerView" bundle:nil]; 
+0

У моего xIV-файла UIView уже был установлен класс HZEventDrawerView. Когда я использую initWithNibNamed: инициализатор Xcode не компилируется; Мне сказали, что «Нет видимого @interface для« HZEventDrawerView »объявляет селектор« initWithNibNamed: bundle: »« –

+0

Я считаю, что вы считаете, что мой UIViews xib-класс является подклассом UIViewController. В настоящее время это подкласс UIView, который не имеет этого метода. –

+0

Как показано в моем обновлении, похоже, что это не мой XIB, который вызывает проблему. По какой-то причине даже создание UIView прагматично и добавление его в ячейку не работает. –

0

Следующая строка проблема:

// Grab the selected cell and make sure it's an event cell 
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 

Вы запрашиваете новую ячейку из UITableViewDataSource! Вместо этого, вы должны получить ячейку из UITableView непосредственно:

// Grab the selected cell and make sure it's an event cell 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

Ура!

+0

Спасибо, гость, я пробовал, что, однако, это не проблема. Когда я вызываю его с помощью старой строки, запускается реализация метода cellForRowAtIndexPath: method, и я могу пройти через нее с помощью отладчика. Когда я делаю это, как вы предложили (я тоже пробовал это сегодня сегодня), моя точка останова никогда не попадает в этот метод. Однако возвращается UITableViewCell. Я не уверен, почему моя реализация никогда не попадает в точку останова. –

+0

Я должен уточнить, возвращается UITableViewCell, хотя точка останова никогда не попадает. Однако UIView не отображается в UITableViewCell в любом случае. Поэтому я в тупике. –