gpt4 book ai didi

objective-c - 在不使用 reloadData 的情况下动态更新 UITableView 的部分

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:32 30 4
gpt4 key购买 nike

首先,如果有人回答了这个问题,我深表歉意。我已经为此斗争了太久。如果能提供任何帮助,我将不胜感激。

我正在开发一个应用程序,它从不同的 Web 源异步获取数据并将其解析为由我的主模型处理的对象。该模型为 UITableView 提供信息。当接收和解析数据时,我需要修改 TableView 中的部分和行数。我首先接收决定部分数量的数据,然后异步接收修改每个部分中的行数及其内容的数据。我设置了 TableView 数据源。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.

return [self.sijainti.pysakit count];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
//if ([[[self.sijainti.pysakit objectAtIndex:section] ajatStr] count] == 0) return 1;
NSLog(@"ajatStr of section: %d count: %d",section, [[[self.sijainti.pysakit objectAtIndex:section] ajatStr] count]);
return [[[self.sijainti.pysakit objectAtIndex:section] ajatStr] count];
}

对象名称是芬兰语(长话短说)。对 numberOfRowsInSection 的第二行进行了注释以简化调试。现在,因为数据是动态的,所以我需要在准备好显示数据时更新界面,否则用户不会知道它,直到他们再次滚动并返回。我有一个方法:

- (void)updateRowWithCell:(SCPysakki *)valmisPysakki {
if (!valmisPysakki.isInArray) return;

int section = [self.sijainti.pysakit indexOfObject:valmisPysakki];

[self.tableView beginUpdates];
NSIndexSet *sectionSet = [NSIndexSet indexSetWithIndex:section];
[self.tableView reloadSections:sectionSet withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}

这仅在已知部分数后调用。由于效率和动画,我不想使用 reloadData。我曾经有这个设置,所以我只有行并且只是在行内绘制行。但是一旦行变得比iphone屏幕高,就变得很不清晰,因为你看不到标题。所以我做了它们的部分,并且行绘制了真实的行。然后我突然遇到了一个问题。 reloadRowsAtIndexPaths: withRowAnimation: 工作得很好但是使用 reloadSections: withRowAnimation: 给了我这个异常(exception):

* Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037

2012-09-17 04:11:27.769 pysappi[2351:f803] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 1. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

我可以通过将 [self.tableView endUpdate] 和 [self.tableView endUpdate] 添加到更新方法来消除这种情况。但是哦,不,这只有在我:

  1. 在收到决定部分数量的数据后使用 reloadData(这反过来缩短了表格 View ,以便在每次更新后整个更新后用户位于表格顶部。我宁愿动态更新部分,不使用 reloadData,删除部分时除外,但如果我尝试这样做,我会再次遇到异常。)

  2. 在仅接收一行数据后更新部分(因此,如果我在收到所有数据后尝试更新部分中的所有行,我会再次遇到异常。)

现在这造成了创建良好的用户界面变得不可能的情况。我确信根本问题并没有通过开始和结束更新调用得到解决,但只是出于一些非常非常奇怪的原因修复了它。

我还尝试使用 insertRowsAtIndexPaths: 手动添加行并手动更新它们,但这会返回完全相同的错误。在长时间的调试过程中,我已经能够确定在调用 cellForRowAtIndexPath: 之后会出现此异常,并且它会为更新期间添加的新行之一返回一个单元格,即使 numberOfRowsInSection 应该已经更新了行数。我还假设,如果这少数情况适用,这就是开始和结束更新方法使行更新有效的原因。

除了我上面解释的之外,唯一有效的方法是仅使用 reloadData,但考虑到更新量,这实际上是不可能的。

这比我想象的要长得多,现在是凌晨 4.30。由于这个异常(exception),我已经不是第一次这么晚起床了。如果您需要更多信息,请询问。提前谢谢你。

最佳答案

(在评论中回答。转换为社区 wiki 答案。参见 Question with no answers, but issue solved in the comments (or extended in chat))

@deleted_user 写道:

number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), - you had a section with zero rows and did an update with a row - cocoa didnt see that as an insert and failed you

关于objective-c - 在不使用 reloadData 的情况下动态更新 UITableView 的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452187/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com