Перезагрузить UITableView, когда возвращаетесь?
у меня есть верхний уровень UIViewController, которая содержит UITableView. Верхний уровень UIViewController создает экземпляр a NavigationController, и толкает другого UIViewController на NavigationController. То есть мы переходим к новому, второму взгляду. Этот второй вид имеет обычную кнопку "Назад" в верхнем левом углу, чтобы вы могли вернуться к виду верхнего уровня.
можно ли при переходе обратно на вид верхнего уровня со второго вида перерисовать UITableView в представлении верхнего уровня, используя данные, созданные в второй вид, позвонив cellForRowAtIndexPath в верхнем уровне и если да, то как это делается?
7 ответов:
все, что вам нужно сделать, это (в вашем UIViewController, который имеет UITableView). Вам не нужно беспокоиться о том, что происходит на клеточном уровне в этот момент.
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView reloadData]; // to reload selected cell }просто добавьте код выше на свой контроллер, и вы увидите, что правильная вещь происходит, когда вы возвращаетесь со своего второго просмотра. Звонок в
reloadDataсообщает табличному представлению, что ему нужно обновить свои ячейки из вашей модели, и все остальное следует красиво.
если вы хотите только перезагрузить ячейку, которая была выбрана, переопределите
viewWillAppear:в вашем пользовательском подклассеUITableViewControllerвот так:- (void)viewWillAppear:(BOOL)animated { NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; [super viewWillAppear:animated]; // clears selection if (selectedRowIndexPath) { [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone]; } }Примечание: предполагая, что вы оставили
clearsSelectionOnViewWillAppearзначениеYES(по умолчанию), вы должны получить путь индекса выбранной строки перед вызовомsuper, который очищает выбор.и решение @ZoranSimic позвонить
[self.tablView reloadData]приемлемо, так как это меньше кода и до сих пор эффективный.наконец, возможно, лучший способ сохранить ячейки вашего табличного представления в синхронизации с объектами модели, которые они представляют, - это сделать как
NSFetchedResultsControllerи использовать ключ-значение наблюдения (кво) и/илиNSNotificationчтобы сообщить вашему контроллеру табличного представления, когда объекты модели изменились, чтобы он мог перезагрузить соответствующие ячейки. Контроллер табличного представления может начать наблюдение за изменениями своих объектов модели вviewDidLoadи конец наблюдения вdealloc(и где вы вручную разгружатьself.view).
кроме ответ Зоран Симич вот Swift код:
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) tableView.reloadData() }
вы можете реализовать методы
UINavigationControllerDelegateи создать логику для обновления при появлении контроллеров вида.другой способ сделать это будет реализация на вашем контроллере табличного представления некоторой логики на
viewWillAppear, чтобы обновить на основе данных контроллера выскочил вид.Если вам нужно отправить данные со второго контроллера вида на первый контроллер вида, помните, что ваш второй контроллер вида "не знает" о существовании предыдущего представления контроллер. Она должна быть для него прозрачной. Вы должны реализовать некоторый протокол, чтобы заставить второй контроллер представления отправлять данные на первый контроллер представления. Это был бы третий вариант этой проблемы, так как ваш первый контроллер представления был бы делегатом, а второй контроллер представления отправлял бы информацию делегату, вы могли бы подготовить свое табличное представление (первый контроллер представления) для перезагрузки на основе полученных данных.
viewWillAppearвызывается каждый раз, когда представление появляется включить в первый раз. Вот мое решение для перезагрузки представления только при переходе назадЯ создаю одну переменную в
.h fileмоегоViewControllerдля проверки, что это первый раз, когда я иду к этомуViewControllerили когда я перехожу назад@property (nonatomic) BOOL isViewExist;после этого в
viewWillAppear-(void)viewWillAppear:(BOOL)animated{ if(!self.isViewExist){ self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything }else{ [self.tableView reloadData]; // to reload the tableview data // or your can refresh anything in your ViewController as you want } }надеюсь, что это поможет
может быть, теперь может помочь.
на Swift 2+
в вашем методе viewDidAppear:
Если вы хотите перезагрузить всю таблицу:
tableView.reloadData()Если вы хотите перезагрузить только выбранную ячейку.
let index = tableView.indexPathForSelectedRow if (index != nil){ self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic) }
обновлено для Swift 3
let index = tableView.indexPathForSelectedRow if (index != nil){ self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic) }
Comments