使用NSFetchedResultsController

时间:2017-02-19 19:16:25

标签: ios objective-c uitableview core-data

我在tableview中使用NSFetchedResultsController,它运行正常。我的问题是,我想创建"没有数据视图"当我的_fetchedResultsController有0行时。

我尝试在我的numberOfSectionsInTableView:中创建它

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if ([[_fetchedResultController.sections firstObject] numberOfObjects] == 0) {
        MyNoDataView *view = [[MyNoDataView alloc] initWithFrame:tableView.frame];
        tableView.backgroundView = view;
        tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        return 0;
    }
    else {
        tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        tableView.backgroundView = nil;
        return  1;  
    }
}

效果很好。如果尚未插入数据,则表明没有数据视图,如果有数据,则会显示我的tableview。

当我在其行上执行删除操作时,我的问题就开始了。从技术上讲,我只是使用isActive

fetchRequest中将其对象属性(fetchedResultController)更新为我的NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isActive == %@ ", @YES];
[fetchRequest setPredicate:predicate];

然后,如果只有一行,并且我将其删除,则会出现此错误

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView internal bug: unable to generate a new section map with old section count: 1 and new section count: 0'

所以我尝试删除numberOfSectionsInTableView:,突然间那些错误消失了。我不知道这里发生了什么,但我认为我对numberOfSectionsInTableView:的条件有误。

任何帮助将不胜感激。非常感谢你!

1 个答案:

答案 0 :(得分:1)

<强>解决

基于Sneak的答案,分配&#34; MyNoDataView&#34;并在numberOfSectionsInTableView中设置seperatorstyles实际上是非常糟糕的做法。所以我最终修改了获取结果控制器委托的controllerDidChangeContent:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    if ([controller.fetchedObjects count]) {
        self.tableView.backgroundView = nil;
    }
    else {
        MyDataView *view = [[MyDataView alloc] initWithFrame:self.tableView.frame];
        self.tableView.backgroundView = view;
    }

    [self.tableView endUpdates];
}