Одна из причин, по которой он их часто называет, заключается в том, что все может резко меняться каждый раз, когда появляется [... reloadData] или что-то в этом роде, поэтому он не может делать никаких предположений о том, что все так, как было в прошлый раз, когда вы звонили их. Это одна из причин того, что они делают большую часть из кеширования UITableViewCells
в документах, например.
Вот класс, демонстрирующий это:
<pre>@interface WinnersViewController : UITableViewController {
}
- (void)setDataSourceAndDelegate;
@end
В моем viewDidLoad я вызываю метод с именем setDataSourceAndDelegate
, который устанавливает один из трех классов в качестве свойств источника данных и делегата в табличном представлении.
- (void)viewDidLoad {
[self setDataSourceAndDelegate];
[super viewDidLoad];
}
У меня есть три различных объекта, которые я использую как DataSource и Delegate (вместе взятые), с абстрактным классом над ними:
WinnersViewDefaultDSD
WinnersViewHasLocationDSD
WinnersViewHasExampleDSD
(по понятным причинам я заменил фактическое имя класса на пример с примером).
Теперь эти классы возвращают очень разные вещи в табличное представление, и иногда, когда изменяется состояние моего приложения (например, вызвав CoreLocation или пользователь выбирает экземпляр примера класса, метод setDataSourceAndDelegate
вызывается снова, и он можно изменить, какой объект это на лету.
Итак, причина того, что UITableView вызывает так много вещей в своем делегате и источнике данных так много раз, заключается в том, что он должен поддерживать разработчиков, которые делают подобные вещи с табличным представлением. Если бы определенные методы вызывались один раз, а затем предполагалось, что ответ остается неизменным, он не был бы таким гибким.
В любом случае, надеюсь, это полезный пример.
(о, и если кто-то собирается подражать этому, обратите внимание, что свойства делегата и источника данных в TableView являются копиями и не сохраняются, поэтому вам нужно сделать дополнительное сохранение для экземпляров классов DSD, или вы получите таинственный, но частый сбой.)
(Кроме того, мне нужно было переопределить viewDidAppear для различных подклассов DSD, и в итоге мне пришлось это сделать:)
- (void)viewDidAppear:(BOOL)animated
{
[[(UITableView*)self.view delegate] delegatedViewDidAppear];
}
(это бит взлома, который не позволяет мне отслеживать объект DSD в классе.)