iphone SDK - перезагрузить таблицу данных - из отдельного класса - PullRequest
1 голос
/ 27 января 2010

Я хотел бы запустить код [tableView reloadData], за исключением того, что я хочу вызвать его из отдельного класса в контроллер представления, в который я хочу перезагрузить данные.

(Примечание. Если есть что-то более эффективное для перезагрузки табличного представления, чем reloadData, присоединяйтесь).

Скажите, что представление, которое я хочу перезагрузить, это 'RootViewController', и я в настоящее время нахожусь в 'DetailViewController', что мне нужно сделать, чтобы заставить его работать.

Моя лучшая попытка сейчас - [RootViewController.tableView reloadData], но это не правильно. (Я получаю сообщение об ошибке: ожидается ':' до. Token.

С уважением, @ norskben

Ответы [ 2 ]

9 голосов
/ 27 января 2010

Вы можете использовать уведомления или протокол.

Использование уведомлений:

опубликовать уведомление сразу после окончания сохранения данных и перед возвратом из метода. Как то так:

// опубликовать уведомление [[NSNotificationCenter defaultCenter] postNotificationName: @ "DataSaved" объект: nil];

В контроллере, работающем со столом, реализовать

- (void) dataSaved:(NSNotification *)notification{

    [self.tableView reloadData];

}

и в его метод viewDidLoad добавьте следующий код для регистрации уведомлений:

[[NSNotificationCenter defaultCenter] addObserver:self
                                selector:@selector(dataSaved:)
                                                 name:@"DataSaved" object:nil];

наконец, отмените регистрацию в методе dealloc, добавив

[[NSNotificationCenter defaultCenter] removeObserver:self];

Использование протокола:

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

@protocol dataSavedDelegate
-(void)dataSaved;
@end

как только вы закончите сохранение данных:

[(id< dataSavedDelegate >)object dataSaved];

Теперь в вашем предыдущем контроллере вы обрабатываете метод делегата: в методе dataSaved() вы перезагружаете свою таблицу.

1 голос
/ 27 января 2010

Вам нужна ссылка на ваш экземпляр RootViewController в DetailViewController. Объявите свойство в DetailViewController и, когда вы создаете экземпляр DetailViewController (я полагаю, из RootViewController), задайте для него что-то вроде

// in RootViewController.m
detailController.rootController = self;
[self.navigationController pushViewController:...

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

[self.rootController.tableView reloadData];

Другой способ - опубликовать пользовательский NSNotification в DetailViewController, когда вы хотите, чтобы RootController перезагрузился и заставил RootController прослушивать уведомление.

Другим способом является перезагрузка таблицы только тогда, когда пользователь возвращается к корневому контроллеру (сделайте это в viewWillAppear: метод RootViewController), для чего перезагрузите таблицу, которая даже не отображается на экране?

...