我已经在我的数据单例和我的UITableView之间成功实现了KVO
。它正在观察@property
。 tableview正确地添加,删除和更新行。
我最近在我的表中添加了部分(基于数组中每个项目的类别)。 tableview加载正确,我有一个部分数组,然后我的代码循环通过KVO
属性来填充这些部分。
然而,每当我编辑其中一行(并且它移动到不同的部分)时,应用程序崩溃抱怨我在X部分中的行数无效。
KVO
是否需要额外的逻辑来正确管理更改的部分长度和行?我的相当通用的observeValueForKeyPath
方法如下。我尝试在switch语句中添加insertSections,deleteSections和reloadSections的方法,但这没有帮助。任何建议表示赞赏。
我创建NSIndexPath
时,我的部分始终为0,但是我无法弄清楚如何使用方法参数确定新部分。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == [DataStore sharedInstance] && [keyPath isEqualToString:kPropertyObserved]) {
NSKeyValueChange kindOfChange = [change[NSKeyValueChangeKindKey] unsignedIntegerValue];
if (kindOfChange == NSKeyValueChangeSetting) {
[self.tableView reloadData];
} else if (kindOfChange == NSKeyValueChangeInsertion ||
kindOfChange == NSKeyValueChangeRemoval ||
kindOfChange == NSKeyValueChangeReplacement){
NSIndexSet *indexSetOfChanges = change[NSKeyValueChangeIndexesKey];
NSMutableArray *indexPathsThatChanged = [NSMutableArray new];
[indexSetOfChanges enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:idx inSection:0];
[indexPathsThatChanged addObject:newIndexPath];
}];
[self.tableView beginUpdates];
switch (kindOfChange) {
case NSKeyValueChangeInsertion:
[self.tableView insertRowsAtIndexPaths:indexPathsThatChanged withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSKeyValueChangeRemoval:
[self.tableView deleteRowsAtIndexPaths:indexPathsThatChanged withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSKeyValueChangeReplacement:
[self.tableView reloadRowsAtIndexPaths:indexPathsThatChanged withRowAnimation:UITableViewRowAnimationAutomatic];
break;
default:
break;
}
[self.tableView endUpdates];
}
}
}