2014-01-02 2 views
11

Я пытаюсь получить Разрез заголовка, используя этот код:Как получить заголовок раздела с UITableView

[tableView headerViewForSection:indexPath.section]; 

но этот код всегда возвращает меня ноль. Не могли бы вы привести несколько примеров, чтобы получить представление заголовка раздела из представления таблицы? Это моя реализация viewForHeader:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 

    DynamicHeader *headerView = [[DynamicHeader alloc] init]; 
     headerView.frame = CGRectMake(0, 0, 320, 40); 
     UILabel *headerLbl = [[UILabel alloc] init]; 
     headerLbl.frame = CGRectMake(10, 10, 300, 20); 
     if(((SectionViewController *)sharedInstance.currentViewController).currentSectionType == 25) 
     { 
      UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minus.png"]]; 
      imgView.frame = CGRectMake(285, 14.5, 16, 13); 
      [headerView addSubview:imgView]; 
      UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:sharedInstance action:@selector(headerTap:)]; 
      [headerView addGestureRecognizer:recognizer]; 
      headerView.tableView = tableView; 
      headerView.heightForRows = 95; 
      headerView.isOpen = YES; 
     } 
headerLbl.text = [[[[[((SectionViewController *)sharedInstance.currentViewController).responseDictionary valueForKey:DATA_PARAMETER] valueForKey:SECTION_TABLE_PARAMETER] objectAtIndex:section] valueForKey:TABLE_SECTION_HEADER] capitalizedString]; 
[headerView addSubview:headerLbl]; 

     return headerView; 

} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

if((DynamicHeader *)[tableView headerViewForSection:indexPath.section] != nil) 
     { 
      return ((DynamicHeader *)[tableView headerViewForSection:indexPath.section]).heightForRows; 
     } 
     else 
     { 
      return 95; 
     } 

} 


- (void)headerTap: (UITapGestureRecognizer *)recognizer 
{ 
    DynamicHeader *view = (DynamicHeader *)[recognizer view]; 
    if(view.isOpen) 
    { 
     view.heightForRows = 0; 

    } 
    else 
    { 
     view.heightForRows = 95; 
    } 
    view.isOpen = !view.isOpen; 

    [view.tableView beginUpdates]; 
    [view.tableView endUpdates]; 
} 
+0

Вы использовали определенный - (UIView *) Tableview : (UITableView *) tableView viewForHeaderInSection: (NSInteger) для назначения вида? – cjd

+0

Что (если есть) - это ваша реализация 'headerViewForSection:'? –

+0

@rokjarc Я обновил свой вопрос. –

ответ

1

Вы реализованы

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

и

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 

в вашем ViewController подкласса?

И если да, возможно, у вас есть проблема в одном из этих методов.

+0

Да, я реализовал эти методы. –

+0

@ KiselAlexander, вызывает cellForRowAtIndexPath вместо этого также возвращает ноль? – Nikita

+0

cellForRowAtIndexPath работает отлично. –

0

Куда вы звоните: [tableView headerViewForSection:indexPath.section];?

Если вы вызываете его в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath, прежде чем tableView будет виден, вы получите нуль, поскольку tableView еще не настроен.

Если вы называете это еще раз, когда загружается таблицаView, вы должны получить обратно UITableViewHeaderFooterView.

+0

Я звоню [tableView headerViewForSection: indexPath.section]; в heightForRowAtIndexPath, когда tableview уже виден. –

+0

Да, вызывая это в heightForRow, возвращает nil для меня тоже. Я подозреваю, что заголовок не настроен/обновлен, когда tableview вычисляет высоты ячеек. Однако это не касается событий сотовой связи. Если у вас есть собственное представление заголовка, возможно, вы можете создать IBOutlet для него? –

-1

heightForRowAtIndexPath позвонил до viewForHeaderInSection, поэтому, конечно, вы получите nil.

+0

Я звоню heightForRowAtIndexPath несколько раз. Когда я создаю табличное представление, а затем, когда я вызываю [tableview beginUpdates]. Во втором случае у меня уже есть заголовок для раздела. –

+0

Не могли бы вы рассказать, в чем заключается необходимость вызова headerViewForSection в heightForRowAtIndexPath? – cjd

+0

У меня есть заголовок заголовка пользовательского раздела, который содержит высоту для всех ячеек в этом разделе. Я не хочу иметь дополнительные переменные в моем основном классе, поэтому я сохраняю высоту в заголовке. –

6

Довольно старый вопрос, но, возможно, решение полезно для других тоже ...

UITableView делает создавать представление ячейки, верхнюю и нижние колонтитулы, только если они необходимы (например, они отображаются в области просмотра содержимого таблицы).

Если ячейка, заголовок или вид сноска не виден в виде таблицы, вызов «cellForRowAtIndexPath:», «headerViewForSection:» или «footerViewForSection:» может вернуться "ноль ». (см. UITableView.h для документирования этого поведения. Единственным исключением было бы то, что представление не было переработано с помощью табличного представления)

Конечно, вы можете создать любое представление представления таблицы, вызвав метод ответственного делегирования напрямую, но UITableView не сделал бы этого сам по себе.

Таким образом, решение для доступа к ячейке, заголовок верхнего нижнего колонтитула, должно сделать его видимым в представлении таблицы первым.

Пример для зрения заголовка:

CGRect sectionHeaderRect = [self.tableView rectForHeaderInSection:groupSectionIndex]; 
[self.tableView scrollRectToVisible:sectionHeaderRect 
          animated:NO]; 

// Let the tableview load the needed views 
dispatch_async(dispatch_get_main_queue(), ^{ 

    UITableViewHeaderFooterView* groupSectionHeaderView = [self.tableView headerViewForSection:sectionIndex]; 

    // Use groupSectionHeaderView 
}); 
+0

В моем случае он всегда возвращает нуль, несмотря на то, что заголовок видимый и индекс правильный. – Ixx

2

Используйте этот метод делегата для доступа вид заголовка:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section

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