Как получить заголовок раздела из 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];
}
Ответы
Ответ 1
Довольно старый вопрос, но, возможно, решение полезно и для других...
UITableView создает представления ячейки, заголовка и нижнего колонтитула только в том случае, если они необходимы (например, они видны в области содержимого табличного представления).
Если вид таблицы, заголовка или нижнего колонтитула не отображается в представлении таблицы, вызов " cellForRowAtIndexPath:", " headerViewForSection:" или " > footerViewForSection: 'может возвращать' nil.
(См. 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
});
Ответ 2
Используйте этот метод делегата для доступа к представлению заголовка:
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
Ответ 3
Вы реализовали
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
и
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
в подклассе ViewController?
И если да, возможно, у вас есть какая-то проблема в одном из этих методов.
Ответ 4
Где вы звоните [tableView headerViewForSection:indexPath.section];
?
Если вы вызываете его в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
до того, как будет видна таблицаView, вы получите нуль, поскольку tableView еще не настроен.
Если вы называете это else, где после загрузки таблицыView вы должны вернуть UITableViewHeaderFooterView
.
Ответ 5
heightForRowAtIndexPath
вызывается до viewForHeaderInSection
, поэтому, конечно, вы получите nil
.