Подтвердить что ты не робот

Перезагрузите UITableView при навигации обратно?

У меня есть верхний уровень UIViewController, который содержит UITableView. Верхний уровень UIViewController создает экземпляр NavigationController и толкает другой UIViewController на NavigationController. И.Е. мы выдвигаем новый, второй взгляд. Это второе представление имеет обычную кнопку "Назад" в верхнем левом углу, чтобы вы могли вернуться к виду верхнего уровня.

Возможно ли при переходе назад в верхний уровень со второго представления перерисовать UITableView в верхнем уровне, используя данные, созданные во втором представлении, вызывая cellForRowAtIndexPath на верхнем уровне и если да, то как это сделать?

4b9b3361

Ответ 1

Все, что вам нужно сделать, это это (в вашем UIViewController с UITableView). Вам не нужно беспокоиться о том, что происходит на уровне ячейки на данный момент.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView reloadData]; // to reload selected cell
}

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

Ответ 2

Если вы хотите только перезагрузить выделенную ячейку, переопределите 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 и использовать наблюдение за ключевыми значениями (KVO) и/или NSNotification, чтобы сообщить вашему представлению таблицы когда объекты модели изменились, чтобы они могли перезагрузить соответствующие ячейки. Контроллер табличного представления может начать наблюдать за изменениями своих объектов модели в viewDidLoad и заканчивать наблюдение в dealloc (и где угодно вы вручную выгружать self.view).

Ответ 3

В дополнение к ответу Zoran Simic здесь код Swift:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}

Ответ 4

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

Другой способ сделать это - реализовать на вашем контроллере представления таблиц некоторую логику на viewWillAppear, чтобы обновить данные на основе выведенного контроллера.

Если вам нужно отправить данные с второго контроллера представления на первый контроллер представления, помните, что ваш второй контроллер представления "не знает" о существовании предыдущего контроллера представления. Он должен быть прозрачным для него. Вы должны реализовать некоторый протокол, чтобы второй контроллер представления данных передал данные на первый контроллер представления. Это будет третий вариант этой проблемы, так как ваш первый контроллер представления будет делегатом, а второй контроллер представления отправит информацию делегату, вы можете подготовить свой табличный вид (контроллер первого представления) для перезагрузки на основе полученные данные.

Ответ 5

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
    }
}

Надеемся на эту помощь

Ответ 6

Может быть, теперь может помочь.

Для Swift 2 +

В вашем методе viewDidAppear:

Если вы хотите перезагрузить всю таблицу:

tableView.reloadData()

Если вы хотите перезагрузить только выбранную ячейку.

let index = tableView.indexPathForSelectedRow
if (index != nil){
  self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic)
}

Ответ 7

Обновлен для Swift 3

let index = tableView.indexPathForSelectedRow
    if (index != nil){
        self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic)
    }