Многоразовые представления заголовков TableView - PullRequest
29 голосов
/ 06 июня 2009

Для повышения производительности обычно используют ячейки UITableView. Есть ли способ сделать то же самое с представлениями заголовка TableView? Я говорю о тех, которые возвращаются методом делегата:

- (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;
}

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

Ответы [ 3 ]

34 голосов
/ 06 июня 2009

Причина, по которой Apple встроила возможность повторного использования ячеек табличного представления, заключается в том, что, хотя табличное представление может иметь много строк, на экране отображается только небольшое количество. Вместо выделения памяти для каждой ячейки приложения могут повторно использовать уже существующие ячейки и при необходимости перенастраивать их.

Во-первых, представления заголовков - это просто UIViews, и, хотя UITableViewCell является подклассом UIView, они не предназначены для размещения в качестве представления заголовка раздела.

Кроме того, поскольку у вас, как правило, будет гораздо меньше заголовков разделов, чем общего количества строк, нет особых оснований для создания механизма повторного использования, и фактически Apple не реализовала его для универсальных UIViews.

Обратите внимание, что если вы просто устанавливаете метку для заголовка, вы можете использовать -(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;
}
11 голосов
/ 15 июля 2016

Вы можете реализовать это, создав UITableViewHeaderFooterView класс это подкласс UIView Вам также необходимо создать отдельный XIB, так как он не будет создан автоматически при создании UITableViewHeaderFooterView .

Регистрация пера с табличным видом

[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

10 голосов
/ 18 апреля 2012

Простое, но эффективное решение:

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...