Повторное использование заголовков TableView
Для производительности обычно использовать ячейки UITableView.
Есть ли способ сделать то же самое с представлениями TableView header?
Я говорю о тех, которые возвращаются с помощью метода делегирования:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
Я попытался сделать следующее, которое, похоже, не работает должным образом:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
static NSString *CellIdentifier = @"Header";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) {
cell = [self getHeaderContentView: CellIdentifier];
}
return cell;
}
Есть ли способ повторного использования заголовков?
Ответы
Ответ 1
Причина, по которой Apple способна повторно использовать ячейки tableview, заключается в том, что, хотя в представлении tableview может быть много строк, на экране отображается только небольшая часть. Вместо выделения памяти для каждой ячейки приложения могут повторно использовать уже существующие ячейки и при необходимости перенастроить их.
Во-первых, заголовки представляют собой только UIViews, а UITableViewCell является подклассом UIView, они не предназначены для размещения в виде заголовка раздела.
Кроме того, поскольку у вас, как правило, будет гораздо меньше заголовков разделов, чем общих строк, нет оснований для создания механизма повторного использования, и на самом деле Apple не реализовала один для общих UIView.
Обратите внимание, что если вы просто устанавливаете метку в заголовок, вы можете использовать -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
вместо этого.
Для чего-то более обычного, например ярлыка с красным текстом (или кнопкой, изображением и т.д.), вы можете сделать что-то вроде этого:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0,0, 320, 44)] autorelease];
UILabel *label = [[[UILabel alloc] initWithFrame:headerView.frame] autorelease];
label.textColor = [UIColor redColor];
label.text = [NSString stringWithFormat:@"Section %i", section];
[headerView addSubview:label];
return headerView;
}
Ответ 2
Простое, но эффективное решение:
@interface SectionedTableViewController ()
@property (nonatomic, strong) UINib* sectionHeaderNib;
@property (nonatomic, strong) NSMutableArray* sectionHeaders;
@end
@implementation SectionedTableViewController
@synthesize sectionHeaderNib = sectionHeaderNib_;
@synthesize sectionHeaders = sectionHeaders_;
- (void) viewDidUnload
{
self.sectionHeaders = nil;
[super viewDidUnload];
}
- (NSMutableArray*) sectionHeaders
{
if (!sectionHeaders_)
self.sectionHeaders = [NSMutableArray array];
return sectionHeaders_;
}
- (UINib*) sectionHeaderNib
{
if (!sectionHeaderNib_)
self.sectionHeaderNib = [UINib nibWithNibName: NSStringFromClass(YourHeaderView.class) bundle: nil];
return sectionHeaderNib_;
}
- (YourHeaderView*) dequeueHeader
{
return [self.sectionHeaders firstObjectPassingTest: ^(id obj) { return (BOOL) ([obj superview] == nil); }];
}
- (NSString*) sectionHeaderTitleForSection: (NSInteger) section
{
return nil;
}
- (UIView*) tableView: (UITableView*) tableView viewForHeaderInSection: (NSInteger) section
{
YourHeaderView* headerView = [self dequeueHeader];
if (!headerView)
{
headerView = [YourHeaderView instanceFromNib: self.sectionHeaderNib];
[self.sectionHeaders addObject: headerView];
}
return headerView;
}
@end
Ответ 3
Это можно реализовать, создав класс UITableViewHeaderFooterView
это подкласс UIView
Вам также необходимо создать отдельный XIB, поскольку он не будет создан автоматически с созданием UITableViewHeaderFooterView.
Зарегистрировать Nib с табличным просмотром
[self.tblCart registerNib:[UINib nibWithNibName:@"CartHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"CartHeader"];
Теперь вы можете получить доступ к этому в viewForHeaderInSection
-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
CartHeaderView *sectionHeader=[tableView dequeueReusableHeaderFooterViewWithIdentifier:@"CartHeader"];
return sectionHeader;
}
Примечание:
Чтобы установить цвет фона, вам нужно создать подвью с тем же фреймом, что и заголовок раздела, и задать цвет для этого вида.
вы можете следовать
Изменение цвета фона в UITableViewHeaderFooterView, загруженном из xib, говорит, чтобы вместо этого использовать contentView.backgroundColor