我有一个UITableView,它的数据源从调用PHP脚本更新,如果有任何数据需要更新,响应会向Array添加一个新对象。如果通过TimeStamp添加了新项目,则调用在数据库表中进行检查,如果有新数据,则新数据将在数组数据源中占据位置索引0,但是当我使用reloadRowsAtIndexPath时,应用程序崩溃。我想这样做的原因是因为我不想刷新整个UITableView单元格,只需保留现有数据并添加新数据而不影响现有单元格。现在,单元格有一个延迟加载的图像,每次添加新数据时图像重新加载,并且当它执行此操作时不会使应用程序看起来很好,这就是为什么我需要刷新新数据。这就是我的样子使用此reloadRowsAtIndexPaths:
-(void)renderLastTSPostInfo:(NSDictionary*)dic{
NSDictionary *posts = [dic objectForKey:@"posts"];
if((NSNull*)posts != [NSNull null]){
int counter = 1;
int p_ID;
int p_U_ID;
int p_T_ID;
NSString *p_Message;
NSDate *p_Created;
int p_Flagged;
int p_Rated;
NSString *firstNamePost;
NSString *lastNamePost;
NSString *p_userImage;
for(NSDictionary *dict in posts)
{
if((NSNull *)[dict objectForKey:@"P_ID"] != [NSNull null]){
p_ID = [[dict objectForKey:@"P_ID"] intValue];
}
if((NSNull *)[dict objectForKey:@"P_U_ID"] != [NSNull null]){
p_U_ID = [[dict objectForKey:@"P_U_ID"] intValue];
}
if((NSNull *)[dict objectForKey:@"P_T_ID"] != [NSNull null]){
p_T_ID = [[dict objectForKey:@"P_T_ID"] intValue];
}
if((NSNull *)[dict objectForKey:@"P_Message"] != [NSNull null]){
p_Message = [dict objectForKey:@"P_Message"];
}
if((NSNull *)[dict objectForKey:@"P_Created"] != [NSNull null]){
NSString *timestampString = [dict objectForKey:@"P_Created"];
double timestampDate = [timestampString doubleValue];
p_Created = [NSDate dateWithTimeIntervalSince1970:timestampDate];
}
if((NSNull *)[dict objectForKey:@"P_Flagged"] != [NSNull null]){
p_Flagged = [[dict objectForKey:@"P_Flagged"] intValue];
}
if((NSNull *)[dict objectForKey:@"P_Rated"] != [NSNull null]){
p_Rated = [[dict objectForKey:@"P_Rated"] intValue];
}
if((NSNull *)[dict objectForKey:@"U_FirstName"] != [NSNull null]){
firstNamePost = [dict objectForKey:@"U_FirstName"];
}
if((NSNull *)[dict objectForKey:@"U_LastName"] != [NSNull null]){
lastNamePost = [dict objectForKey:@"U_LastName"];
}
if((NSNull *)[dict objectForKey:@"U_Image"] != [NSNull null]){
p_userImage = [dict objectForKey:@"U_Image"];
}
PostInfo *postObj = [PostInfo new];
postObj.iD = p_ID;
postObj.userId = p_U_ID;
postObj.threadId = p_T_ID;
postObj.message = p_Message;
postObj.timeStampCreated = p_Created;
postObj.flagged = p_Flagged;
postObj.rated = p_Rated;
postObj.firstName = firstNamePost;
postObj.lastName = lastNamePost;
postObj.userImage = p_userImage;
[postsArray insertObject:postObj atIndex:0];
if(counter == posts.count){
postLastTimestamp = [dict objectForKey:@"P_Created"];
}
counter += 1;
}
[tableViewPosts beginUpdates];
[tableViewPosts reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableViewPosts endUpdates];
//[tableViewPosts reloadData];
}
}
我得到的错误是:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (11) must be equal to the number of rows contained in that section before the update (10), plus or minus the number of rows inserted or deleted from that section (1 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
答案 0 :(得分:1)
当我遇到这个问题时,我经常重新加载表视图,并且项目尚未添加到集合中。我的解决方案是在reloadData之前调用layoutIfNeeded,此调用将等到绘制当前批处理之前的前一批处理。
[tableViewPosts layoutIfNeeded];
答案 1 :(得分:0)
您没有主动填写数据,只需实现数据源代理。
如果数据已更改,请使用[yourTableView reloadData]刷新,该表将获取所需的数据。如果您知道更改了哪些内容并想要为其设置动画,则还有一些方法可以重新加载部分或几行。
另外,请确保调用主线程(如果您的计时器在另一个线程上触发)。