我正在开发一个iOS应用程序,并且有一个包含文本消息的UITableView(每个消息的表格单元格)。当新消息到达时,在UITableView中添加一个新单元格。起初我使用了一个UITableView部分,并在其下添加了所有单元格。
一切正常,直到我决定改变方案并使用多个部分,每个部分都有一行(这是我发现在单元格之间强制执行空间的最干净的方式)。我对这个方案的问题是每次我尝试添加一个新单元格时都会遇到这个异常:
2015-09-30 11:48:35.659 restcomm-messenger[15069:489766] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UITableView.m:1702
我在[self.tableView endUpdates]执行时得到它(参见下面的完整代码)
我在类似问题中检查过很多SO答案,但我认为我已经做好了一切。以下是“有趣”的代码部分:
新消息到达,更新后备存储和插入行到表:
...
// update the backing store
[self.messages addObject:[NSDictionary dictionaryWithObjectsAndKeys:type, @"type", msg, @"text", nil]];
[self.tableView beginUpdates];
// trigger the new table row creation
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:[self.messages count] - 1]]
withRowAnimation:animation];
[self.tableView endUpdates];
...
节和行计数回调:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.messages count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}
填写单元格回调:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *type = [[self.messages objectAtIndex:indexPath.section] objectForKey:@"type"];
if ([type isEqualToString:@"local"]) {
LocalMessageTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"local-message-reuse-identifier" forIndexPath:indexPath];
cell.senderText.text = [[self.messages objectAtIndex:indexPath.section] objectForKey:@"text"];
return cell;
}
else {
RemoteMessageTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"remote-message-reuse-identifier" forIndexPath:indexPath];
cell.senderText.text = [[self.messages objectAtIndex:indexPath.section] objectForKey:@"text"];
return cell;
}
}
我希望这能奏效。请记住,对于原始方案(1个部分可能是行),它可以正常工作:(
如果您需要更多详细信息,请参阅相关表视图控制器的完整代码:https://github.com/Mobicents/restcomm-ios-sdk/blob/master/Lab/restcomm-messenger-debug/restcomm-messenger/MessageTableViewController.m
欢迎任何提示
安东尼