ios tableView reloadRowsAtIndexPaths无效

时间:2014-05-19 06:12:26

标签: ios uitableview reload

我有一个问题,我有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函数从未调用过,并且单元格没有正确更新。知道问题可能是什么?

编辑:我刚刚注意到,如果我滚动出应该更新的单元格的视图,那么当我滚动回视图时它会更新。在视野中没有办法让它更新吗?

3 个答案:

答案 0 :(得分:6)

如何包裹它?

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

以下是我发现的一些类似问题。

cellForRowAtIndexPath isn't called after reloadRowsAtIndexPaths

UITableView's reloadRowsAtIndexPaths: (NSArray *) indexPaths failing to cause a reload unless you call it twice?

希望这有帮助。

答案 1 :(得分:4)

编辑:我认为你没有得到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];

答案 2 :(得分:1)

我将重装代码推送到主队列解决了问题

DispatchQueue.main.async {
    self.tableView.reloadRows(at: [indexPath], with: .automatic)
}