Вызов метода UITableViewDelegate из ViewController - PullRequest
2 голосов
/ 05 октября 2011

Я бы хотел вызвать следующий метод из моего класса контроллера представления:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; 

Однако за свою жизнь я не могу понять, как это сделать. Я попробовал:

UIView *view = [tableView viewForHeaderInSection:section];
UIView *view = [self viewForHeaderInSection:section];
UIView *view = [self tableView:viewForHeaderInSection:section];

Все дают мне ошибки. Это дополнительный tableView: бит в начале. Кто-нибудь может дать какой-нибудь совет или хотя бы объяснить, что означает tableView:(UITableView *)tableView?

Спасибо! Стив

Ответы [ 2 ]

6 голосов
/ 06 октября 2011

Я не знаю, почему вы хотите вызывать его, но если он реализован в том же объекте, из которого вы вызываете его, тогда вы можете использовать self:

UIView* view = [self tableView:tableView viewForHeaderInSection:section];

в противном случае вы можете получить делегата из tableView и вызвать делегата:

id<UITableViewDelegate> theDelegate = tableView.delegate;
UIView* view = [theDelegate tableView:tableView viewForHeaderInSection:section];
0 голосов
/ 05 октября 2011

Почему вы хотите это назвать?Это один из методов UITableViewDelegate, которые обычно вызываются автоматически при создании таблицы с помощью tableView. Объект класса tableView заполняет необходимые параметры при вызове этого метода.Контроллеру представления нужно только предоставить правильные методы делегата, настроенные вами, чтобы он мог правильно их настроить.

Вы настраивали код, как в этом примере, в своем классе делегата?

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    // create the parent view that will hold header Label
    UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)];

    // create the button object
    UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    headerLabel.backgroundColor = [UIColor clearColor];
    headerLabel.opaque = NO;
    headerLabel.textColor = [UIColor blackColor];
    headerLabel.highlightedTextColor = [UIColor whiteColor];
    headerLabel.font = [UIFont boldSystemFontOfSize:20];
    headerLabel.frame = CGRectMake(10.0, 0.0, 300.0, 44.0);

    // If you want to align the header text as centered
    // headerLabel.frame = CGRectMake(150.0, 0.0, 300.0, 44.0);

    headerLabel.text = <Put here whatever you want to display> // i.e. array element
    [customView addSubview:headerLabel];

    return customView;
}

Я не рядом с моим Mac, или я приведу один из моих собственных примеров.Но это общий способ использования этого метода.


Кстати, вы можете видеть, что на параметр tableView нет ссылки в приведенном выше примере кода.Если вы действительно хотите вызвать этот метод, используйте nil.Протокол UITableViewDelegate позволяет делегировать контроллер для более чем одного tableView.Если это происходит, метод должен проверить, какой tableView является справочным, чтобы можно было приспособить специализированное поведение для каждого tableView.


Дополнительная информация:

Если вы просто хотите увидеть, какова высота заголовка вашего tableView, вы можете оценить его свойство sectionHeaderHeight.Существуют и другие свойства, такие как sectionFooterHeight и rowHeight.

Вы должны знать, что существуют методы делегирования, которые помогают tableView, используя ваши настройки.Таким образом, метод делегата tableView: heightForHeaderInSection: фактически предназначен для вас, чтобы настроить высоту заголовка.Ваши методы делегата сообщают tableView, какова высота.Это не способ проверить свойство tableView.

В документации Apple говорится, что если вы настраиваете с помощью tableView: heightForHeaderInSection: тогда tableView sectionHeaderHeight недопустимо.Вы ожидаете этого, потому что это свойство относится к высоте всех заголовков разделов.

Используя свойство sectionHeaderHeight, которое вы можете записать в этом случае, вы можете установить все заголовки на одинаковую высоту.

Вот пример кода из того, над чем я сейчас работаю.Я добавил для вас заявление NSLog.

resultsTableVC = [[[ResultsTableVC alloc] initWithController:self] retain];

self.tableView = [[[UITableView alloc] initWithFrame:CGRectMake(0, 110, self.view.frame.size.width, self.view.frame.size.height-120) style:UITableViewStyleGrouped] retain];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
self.tableView.autoresizesSubviews = YES;
self.tableView.layer.cornerRadius = 10.0f;

self.tableView.delegate = resultsTableVC;
self.tableView.dataSource = resultsTableVC;
self.tableView.backgroundView = nil;
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.separatorColor = [UIColor defaultResultTableBackgroundColor];
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

[self.view addSubview:self.tableView];

NSLog(@"header: %f, row: %f", tableView.sectionHeaderHeight, tableView.rowHeight);

(Кто-то, вероятно, укажет, что некоторые из этих удержаний мне не нужны. Я все еще работаю над этим.)

Это говорит мне, что стандартная высота сечения равна 100, а стандартная высота строки равна 44.0.У меня есть указатель на мой tableView, свойство, которое я могу использовать через этот класс.

Теперь, если вы устанавливаете высоту заголовка с помощью tableView: heightForHeaderInSection: тогда у вас должна быть высота, уже рассчитанная в вашей программе.Я не думаю, что вы можете запросить высоту определенного раздела (или строки) после его установки.

Помогает ли это?

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