2009-08-27 2 views
3

Я реализую необязательный метод делегата в API Cocoa Touch. То, что я хотел бы сделать, - сначала вызвать метод, который был бы вызван, если я не реализовал делегат ... затем внесите изменения в результат ... затем верните измененную версию.Как вызвать метод, который был бы вызван, если делегат не был там

Вот пример:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; { 
    /* this line: */ UIView * headerView = [someObject tableView:tableView viewForHeaderInSection:section]; 
    [headerView setBackgroundColor:[UIColor redColor]]; 
    return headerView; 
} 

Выделенная линия не работает. Я мог бы поставить someObject = tableView.delegate, но это просто дает мне бесконечную рекурсию. Есть ли какой-то трюк, чтобы заставить tableView делать то, что он сделал бы, если бы дополнительный метод не был реализован? Я не очень надеюсь, но было бы здорово, если возможно.

ответ

6

Там нет метода, который был бы вызван, если вы Бесполезный Внедрить делегата. Делегаты не похожи на подклассы; они не являются языковой особенностью. UITableView (в данном случае), выполняет некоторую работу, смотрит, не является ли его свойство -delegate не равным нулю (это просто случайный ivar, который называется «делегат»), если он видит, что делегат реализует делегат метод, называет его, если он это делает, а затем выполняет некоторую работу.

UITableView не раскрывает заголовок заголовка по умолчанию (это частный подкласс UISectionHeaderCell, который я считаю), поэтому Apple не дает никаких обещаний о том, как это реализовано. или дает нам хороший способ получить это. Есть несколько способов добраться до рассматриваемого мнения, но Apple еще не предоставила нам какой-либо поддерживаемый способ, о котором я знаю.

Но к общему вопросу о делегатах то, о чем вы просите, не существует, потому что это не то, как делегаты реализованы.

2

Я предполагаю, что UITableView делает что-то вроде этого:

if ([delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) { 
    [delegate tableView:self viewForHeaderInSection:section]; 
} else { 
    // Does its own thing instead 
} 

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

3

Заканчивать документацию по respondsToSelector - это дает вам возможность проверить и посмотреть, если объект будет хорошо, реагировать на селекторе :)