Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过KVO更改节行更新UITableView_Ios_Objective C_Uitableview_Key Value Observing - Fatal编程技术网

Ios 通过KVO更改节行更新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方法

我已经成功地在我的数据单例和UITableView之间实现了
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
方法读取以进行删除。它可以工作,但也希望看到其他更好的实现。