出于性能考虑,通常会重用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;
}
有没有办法重用标题'的观点?
答案 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;
}
注意: 要设置背景颜色,您需要创建一个子视图,其框架与节标题相同,并为该视图设置颜色。
你可以关注
答案 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