通过KVO更改节行来更新UITableView

时间:2015-09-21 23:41:11

标签: ios objective-c uitableview key-value-observing

我已经在我的数据单例和我的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];
        }
    }
}

0 个答案:

没有答案