Обновить источник данных родительского контроллера представления - PullRequest
0 голосов
/ 04 февраля 2012

У меня есть три уровня ViewControllers, которые переходят от общей категории к предмету в этой категории до цитаты внутри этого предмета.

Контроллеры вида называются:

1   CategoryViewController
2   SubjectViewController
3   QuoteViewController

Таблица базы данных "SUBJECT" имеет столбец категории и темы.

Когда я нахожусь в SubjectViewController, я могу редактировать или удалять предметы и категории.

Я хочу иметь возможность обновлять источник данных родительского контроллера представления, CategoryViewController и «обновлять» его tableView, поэтому, когда я возвращаюсь к нему, я уже вижу изменения, отраженные в отображаемой таблице.

Как правильно это сделать?

Ответы [ 4 ]

1 голос
/ 04 февраля 2012

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

- (void)subjectViewController:(SubjectViewController*)controller didEditSubject:(Subject*)subject;
- (void)subjectViewController:(SubjectViewController*)controller didDeleteSubject:(Subject*)subject;

SubjectViewController имеет свойство делегата, чтобы сохранить слабую ссылку на его делегат.Он вызывает методы делегата всякий раз, когда данные удаляются или редактируются.

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

ОБНОВЛЕНИЕ:

Предполагая, что в CategoryViewController имеется только один раздел иоставьте объекты в NSMutableArray, вы можете использовать коды, аналогичные приведенным ниже, для обновления соответствующей части табличного представления.

- (void)subjectViewController:(SubjectViewController*)controller didEditSubject:(Subject*)subject{
    NSInteger row;
    NSIndexPath* indexPath;
    NSArray* indexPaths;

    row = [self.subjects indexOfObject:subject];
    indexPath = [NSIndexPath indexPathForRow:row inSection:0];
    indexPaths = [NSArray arrayWithObject:indexPath];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];    
}

- (void)subjectViewController:(SubjectViewController*)controller didDeleteSubject:(Subject*)subject{
    NSInteger row;
    NSIndexPath* indexPath;
    NSArray* indexPaths;

    row = [self.subjects indexOfObject:subject];
    indexPath = [NSIndexPath indexPathForRow:row inSection:0];
    indexPaths = [NSArray arrayWithObject:indexPath];
    [self.subjects removeObjectAtIndex:row];
    [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}
1 голос
/ 04 февраля 2012

Используйте UIViewControllers

@property(nonatomic, readonly) UIViewController *parentViewController

Вы могли бы сделать что-то подобное

CategoryViewController *cvc = (id)self.parentViewController
if ([cvc isKindOfClass:[CategoryViewController class]]) {
  // call stuff on cvc, like a table view's -reloadData
}

Или вы можете ввести тип уведомления и наблюдать за ним.

0 голосов
/ 04 февраля 2012

Проверьте эту ссылку для аналогичного вопроса, и если вам нужна дополнительная информация, вы можете прочитать эту ссылку .

0 голосов
/ 04 февраля 2012

Вы можете отправить глобальное уведомление от активного ViewController (например, SubjectViewController) следующим образом:

[[NSNotificationCenter defaultCenter] postNotificationName:@"refresh_data" object:nil];

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

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

- (void)dataChanged {
// perform the refreshing 

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