Ios 通过KVO更改节行更新UITableView
我已经成功地在我的数据单例和UITableView之间实现了Ios 通过KVO更改节行更新UITableView,ios,objective-c,uitableview,key-value-observing,Ios,Objective C,Uitableview,Key Value Observing,我已经成功地在我的数据单例和UITableView之间实现了KVO。它正在观察一个@属性。tableview可以正确地添加、删除和更新行 我最近在表中添加了部分(基于数组中每个项目的类别)。tableview加载正确,我有一个节数组,然后我的代码循环通过KVO属性来填充这些节 但是,每当我编辑其中一行时(它移动到另一个部分),应用程序就会崩溃,抱怨我在部分X中的行数无效 KVO是否需要额外的逻辑来正确管理不断变化的区段长度和行数?下面是我非常通用的observeValueForKeyPath方法
KVO
。它正在观察一个@属性
。tableview可以正确地添加、删除和更新行
我最近在表中添加了部分(基于数组中每个项目的类别)。tableview加载正确,我有一个节数组,然后我的代码循环通过KVO
属性来填充这些节
但是,每当我编辑其中一行时(它移动到另一个部分),应用程序就会崩溃,抱怨我在部分X中的行数无效
KVO
是否需要额外的逻辑来正确管理不断变化的区段长度和行数?下面是我非常通用的observeValueForKeyPath
方法。我尝试在switch语句中为insertSections、deleteSections和reloadSections添加方法,但没有帮助。谢谢你的建议
当我创建nsindepath
s时,我的节总是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];
}
}
}
我在
NSKeyValueChangeIndexesKey
中使用索引,我可以确定它应该插入到哪个部分,但是我看不出需要从哪个部分中删除它。我尝试使用选项NSKeyValueObservingOptionOld
,但当我在进行更改后记录该值时,它只显示新值。事实上,当我同时使用这两个选项(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew)
时,更改
字典中的两个条目都是相同的(更改[NSKeyValueChangeOldKey]
和更改[NSKeyValueChangeNewKey]
)。我最终使用了[self.tableView reloadData]
进行替换或插入(用户在该点无论如何都看不到表视图)。对于删除,我创建了nsindepath
属性,该属性由KVO
方法读取以进行删除。它可以工作,但也希望看到其他更好的实现。我使用nskeyValueChangeIndexKey
中的索引,我可以确定它应该插入到哪个部分,但是我看不到需要哪个部分我尝试使用选项NSKeyValueObservingOptionOld
,但当我在进行更改后记录值时,它只显示新值。事实上,当我同时使用这两个选项(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew)
,字典中的两个条目都是相同的(change[NSKeyValueChangeOldKey]
和change[NSKeyValueChangeNewKey]
)。我最终使用了[self.tableView reloadData]
进行替换或插入(用户在该点无论如何都看不到表视图)。对于删除,我创建了nsindepath
属性,该属性由KVO
方法读取以进行删除。它可以工作,但也希望看到其他更好的实现。