ios tableView reloadRowsAtIndexPaths не работает

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

Внутри функции viewWillAppear я вычисляю необходимые строки, которые необходимо обновить, следующим образом:

- (void)reloadPaths:(NSMutableDictionary *)bookingsDict
{
    NSMutableArray* indexArray = [NSMutableArray array];
    int i = 0;
    for (NSString *dateKey in self.eventsToShow) {
        NSMutableDictionary *venues = [bookingsDict objectForKey:dateKey];
        if (venues) {
            int j = 0;
            NSArray *events = [self.eventsToShow objectForKey:dateKey];
            for (DCTEvent *event in events) {
                NSString *venueIdString = [NSString stringWithFormat:@"%@", event.eventVenueId];
                if ([venues objectForKey:venueIdString]) {
                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:i];
                    [indexArray addObject:indexPath];
                }
                j++;
            }
        }
        i++;
    }
    [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];
}

Однако я заметил, что функция cellForRowAtIndexPath никогда не вызывается после этого, и ячейки не обновляются правильно. Есть идеи, в чем может быть проблема?

РЕДАКТИРОВАТЬ: я только что заметил, что если я прокручиваю вид ячейки, которая должна обновляться, она обновляется, когда я прокручиваю обратно в вид. Нет ли способа обновить его во время просмотра?


person Atul Bhatia    schedule 19.05.2014    source источник
comment
Вы проверили, содержит ли indexArray действительные данные?   -  person Argent    schedule 19.05.2014
comment
Вот что я вижу в отладчике: po indexArray ‹__NSArrayM 0xd0c3a40›( ‹NSIndexPath: 0xd0dffa0› {length = 2, path = 15 - 0})   -  person Atul Bhatia    schedule 19.05.2014
comment
На самом деле я только что заметил, что если немного прокрутить, ячейка обновится. Я предполагаю, что это означает, что ячейки, находящиеся в поле зрения в данный момент, не будут обновляться, пока вы не прокрутите их?   -  person Atul Bhatia    schedule 19.05.2014
comment
нет... не ломается. Он просто не обновляется, пока я не прокручиваю ячейку из поля зрения.   -  person Atul Bhatia    schedule 19.05.2014
comment
Проверьте мой ответ здесь, чтобы узнать, поможет ли это вам: stackoverflow.com/a/41551850/4546370   -  person Michael Westbrooks II    schedule 09.01.2017


Ответы (3)


Как насчет завернуть?

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

Вот некоторые похожие проблемы, которые я нашел.

cellForRowAtIndexPath не вызывается после reloadRowsAtIndexPaths

reloadRowsAtIndexPaths UITableView: (NSArray *) indexPaths не может вызвать перезагрузку, если вы не вызовете дважды?

Надеюсь это поможет.

person Hsin Chang    schedule 19.05.2014
comment
Спасибо, это сработало. Я где-то читал в stackoverflow, что начальные и конечные обновления не требуются. Я попытался перезагрузить строки по пути, не сработало. Но при объединении reloadRowsAtIndexPaths с self.tableView.beginUpdates() и self.tableView.endUpdates() это сработало. Может кто-нибудь объяснить, зачем нужны begin и end? - person kishorer747; 30.05.2016

EDIT: я думаю, что вы не получаете раздел проверки indexPath, который может быть постоянным, поскольку вы увеличивается, когда каждый объект проходится:

- (void)reloadPaths:(NSMutableDictionary *)bookingsDict
{
    NSMutableArray* indexArray = [NSMutableArray array];
    int i = 0;
    for (NSString *dateKey in self.eventsToShow) {
        NSMutableDictionary *venues = [bookingsDict objectForKey:dateKey];
        if (venues) {
            int j = 0;
            NSArray *events = [self.eventsToShow objectForKey:dateKey];
            for (DCTEvent *event in events) {
                NSString *venueIdString = [NSString stringWithFormat:@"%@", event.eventVenueId];
                if ([venues objectForKey:venueIdString]) {
                    //changed here as section might be constant as i think it might be
                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:0];
                    [indexArray addObject:indexPath];
                }
                j++;
            }
        }
        i++;
    }

    [self.tableView beginUpdates];
    [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView endUpdates];
}

Попробуй это :

//your code here
[self.tableView beginUpdates];

[self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];

[self.tableView endUpdates];
person Paresh Navadiya    schedule 19.05.2014
comment
Проблема все еще существует - мне нужно прокрутить ячейку из поля зрения, чтобы она обновилась. - person Atul Bhatia; 19.05.2014
comment
@AtulBhatia: проверьте, есть ли у indexArray какой-либо индексный путь или нет? - person Paresh Navadiya; 19.05.2014
comment
нет, сечение переменное. Если я меняю reloadRowsAtIndexPaths просто на reloadData, все работает нормально. - person Atul Bhatia; 19.05.2014
comment
Я думаю, что reloadData после reloadRowsAtIndexPaths - единственный способ работать. - person ideawu; 30.12.2014

Для меня добавление моего кода перезагрузки в основную очередь решило проблему.

DispatchQueue.main.async {
    self.tableView.reloadRows(at: [indexPath], with: .automatic)
}
person Heysem Katibi    schedule 17.12.2016