Настроить заголовок раздела для UITableViewController - PullRequest
6 голосов
/ 31 мая 2011

Мне нужно настроить раздел заголовка для 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 ]

11 голосов
/ 14 августа 2012

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

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Header"];
  cell.textLabel.text = @"test";
  return cell;
}
3 голосов
/ 15 июня 2013

Вот как вы можете получить представление в виде пустых участков с помощью методов 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 голосов
/ 31 мая 2011

Вы можете явно указать делегата:

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

Конечно, вы также можете сделать все это в файле пера ...

2 голосов
/ 31 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...