2010-04-18 2 views
3

Я довольно новичок в разработке iPhone и изо всех сил стараюсь найти то, что считаю аккуратным способом решения этой проблемы.Каков наилучший способ обновления UITableView в иерархии UINavigationController

У меня есть пользовательский интерфейс, где сводка данных записи отображается в таблице внутри навигационного контроллера. Когда пользователь нажимает кнопку аксессуара для строки, на навигационный контроллер выводится новое представление, отображающее представление, в котором пользователь может редактировать данные в соответствующей записи. После этого из окна стека навигационного контроллера открывается вид редактирования, и пользователь возвращается в представление таблицы.

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

Невозможно перезагрузить данные таблицы до того, как она будет отображаться, поскольку вызов только обновляет отображаемые записи. Перезагрузка после отображения таблицы приводит к тому, что старые данные меняются перед глазами пользователя, и я не слишком доволен.

Это похоже на довольно нормальную вещь, которую нужно делать в приложении для iPhone.

Может кто-нибудь предложить наилучший подход к этому? Я чувствую, что что-то упускаю.

Cheers - Steve.

ответ

13

Я бы реализовать это следующим образом:

  1. Сохранить indexPath из кликнутой клетки.

  2. Внесите -[UIViewController viewWillAppear:] метод контроллера вида, который содержит UITableView. Если сохранены indexPath не ноль, перегрузить указанные клетки:

    -[UITableView reloadRowsAtIndexPaths:withRowAnimation:]

16

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

В классе Tableview создать метод, как:

-(void)editDone { 
    [self.tableView reloadData]; 
} 

Добавить свойство в контроллер редактирования, как:

@property (assign) id delegate; 

Установите делегат, когда ваш аксессуар щелкнул:

editController.delegate = self; 

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

[delegate performSelector:@selector(editDone) withObject:nil]; 

Вы можете создавать аналогичные методы для обработки отмены вашего компонента редактирования или выполнять отклонение модальных контроллеров редактирования и т. Д. Считается более классным поместить все это в протокол, если хотите.

Смежные вопросы