【问题标题】:ios tableView reloadRowsAtIndexPaths not workingios tableView reloadRowsAtIndexPaths 不起作用
【发布时间】:2014-07-07 00:02:30
【问题描述】:

我有一个问题,我有一个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 函数之后永远不会被调用,并且单元格没有正确更新。知道可能是什么问题吗?

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

【问题讨论】:

  • 您检查过indexArray 是否包含有效数据吗?
  • 这是我在调试器中看到的: po indexArray <__nsarraym>( {length = 2, path = 15 - 0} )
  • 我实际上只是注意到,如果我稍微滚动一下,单元格就会更新。我想这意味着当前视图中的单元格在您滚动离开它们之前不会更新?
  • 不...它不会崩溃。直到我将单元格滚动到视野之外,它才会更新。
  • 在此处查看我的答案,看看是否对您有帮助:stackoverflow.com/a/41551850/4546370

标签: ios uitableview reload


【解决方案1】:

包起来怎么样?

[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?

希望这会有所帮助。

【讨论】:

  • 谢谢,它成功了。我在stackoverflow上的某处读到不需要开始和结束更新。我尝试在路径上重新加载行,但没有用。但是在用self.tableView.beginUpdates() 和self.tableView.endUpdates() 包裹reloadRowsAtIndexPaths 它起作用了。有人可以解释为什么需要开始和结束吗?
【解决方案2】:

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

【讨论】:

  • 问题仍然存在——我必须将单元格滚动到视野之外才能更新。
  • @AtulBhatia: 检查 indexArray 是否有任何索引路径?
  • 不,该部分是可变的。如果我只是将 reloadRowsAtIndexPaths 更改为 reloadData 它工作正常。
  • 我认为 reloadRowsAtIndexPaths 之后的 reloadData 是唯一可行的方法。
【解决方案3】:

对我来说,将我的重新加载代码推送到主队列解决了问题

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

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多