Перезагрузить UITableView, когда возвращаетесь?



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



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

515   7  

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

    Ничего не найдено.