可重用的TableView标题视图

时间:2009-06-06 17:07:34

标签: iphone cocoa-touch

出于性能考虑,通常会重用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 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:11)

您可以通过创建 UITableViewHeaderFooterView 类来实现它 它是 UIView 的子类 您还需要创建一个单独的XIB,因为它不会通过 UITableViewHeaderFooterView 创建自动创建。

使用tableview注册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;
}

注意: 要设置背景颜色,您需要创建一个子视图,其框架与节标题相同,并为该视图设置颜色。

你可以关注

Changing the background color on a UITableViewHeaderFooterView loaded from a xib says to use contentView.backgroundColor instead

答案 2 :(得分:10)

一个简单而有效的解决方案:

@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