自定义UITableViewController的标题部分

时间:2011-05-31 13:45:54

标签: iphone objective-c ipad uitableview

我需要自定义UITableViewController的标题部分,其中每个部分返回不同的标题文本(从数据源获取数据)。这可以使用以下方法完成:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSArray *temp = [listOfMBeans allKeys];
    DLog(@"MBean details: %@", temp);
    NSString *title = [temp objectAtIndex:section];
    DLog(@"Header Title: %@", title);
    return title;
}; 

这很好用,我可以看到预期的输出。但是,我还需要更改文本的字体大小,在查看​​类似的问题后,我实现了以下内容:

- (UIView *) tableview:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    DLog(@"Custom Header Section Title being set");
    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];  

    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
    label.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:section];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:14];

    [headerView addSubview:label];
    return headerView;
}

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 44.0;
}

然而,似乎永远不会调用代码。我的理解是UITableViewController默认设置为委托,但似乎我错了。

以这种方式创建UITableViewController(作为分层数据的一部分):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ProjectDetails *detailViewController = [[ProjectDetails alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.project = [listOfMetrics objectAtIndex:indexPath.row];

    // Push the detail view controller.
    [[self navigationController] pushViewController:detailViewController animated:YES];
    [detailViewController release]; 
}

我应该做些什么改变才能使这个工作? 感谢。

4 个答案:

答案 0 :(得分:11)

这个问题较旧,但我想分享我的代码。我正在使用通常的表格单元格视图来查看节标题。我用接口构建器设计了它并实现了以下委托方法。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Header"];
  cell.textLabel.text = @"test";
  return cell;
}

答案 1 :(得分:3)

您可以明确设置委托:

 detailViewController.tableView.delegate = detailViewController;

或者您可以在控制器初始化功能中执行此操作。

编辑:您的init方法应符合规范初始化。此外,在我看来,你还没有创建你的UITableView。尝试并使用此代码:

- (id)initWithStyle:(UITableViewStyle)style { 
    if ((self = [super initWithStyle:style])) {
        self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
        self.tableView.autoresizingMask =  UIViewAutoresizingFlexibleWidth  UIViewAutoresizingFlexibleHeight;
        self.tableView.delegate = self;
    }
    return self;
}

当然,您也可以在nib文件中执行所有这些操作......

答案 2 :(得分:3)

以下是使用UITableViewDelegate方法获取准系统部分视图的方法:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
  {
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 40.0)];
    header.backgroundColor = [UIColor grayColor];

    UILabel *textLabel = [[UILabel alloc] initWithFrame:header.frame];
    textLabel.text = @"Your Section Title";
    textLabel.backgroundColor = [UIColor grayColor];
    textLabel.textColor = [UIColor whiteColor];

    [header addSubview:textLabel];

    return header;
 }

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
  {
    return 40.0;
  }

答案 3 :(得分:2)

您可以尝试这样做:在ProjectDetails.h中声明UIView *tableHeader和访问方法- (UIView *)tableHeader;。然后在实现文件中:

- (UIView *)tableHeader {
    if (tableHeader)
        return tableHeader;

    tableHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)];
    // addlabel
    return tableHeader;
}

在viewDidLoad中,请致电:self.tableView.tableHeaderView = [self tableHeader];

我不相信你需要使用heightForHeaderInSection方法。