Подтвердить что ты не робот

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

Есть ли способ повторного использования заголовков?

4b9b3361

Ответ 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