Настройка раздела заголовка для UITableViewController

мне нужно настроить раздел заголовка 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;
}
кажется, что код никогда не вызывается. Мой понимание было вот что!--3--> по умолчанию устанавливается как делегат, но, похоже, я ошибаюсь.

на 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 ответов


вы можете установить явно делегат:

 detailViewController.tableView.delegate = detailViewController;

или вы можете сделать это в исходную функцию контроллера.

EDIT: ваш init метод должен соответствовать каноническому 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...


этот вопрос старше, но я хотел поделиться своим кодом. Я использую обычное представление ячейки таблицы для заголовков разделов. Я разработал его с помощью interface builder и реализовал следующий метод делегата.

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

вот как вы получаете вид раздела barebones с помощью методов 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;
  }

вы можете попробовать это: в вашем 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.