1

我花了几个小时试图解决这个问题

发生的情况是我使用 NSFetchedResultController 然后根据 FetchController 的内容更新我的表。

换句话说:标准做法。

我经常看到 reloadData 调用所有的委托。然而,NSFetchedResultController 的空开始突然再次调用 reloadData 之后不会加载委托。

-(void)ReloadorRedraw;
{
    [BNUtilitiesQuick ListController].FetchController=[FetchClass standardFetchControler];
    PO(self);
    //PO(self.tableViewA);
    listNewController * lc = [listNewController singleton];
    PO(lc.FetchController);
    CLog(@"fetchController.fetchedObjects.count %d", lc.FetchController.fetchedObjects.count);
    PO(lc.FetchController.fetchedObjects);
    PO(self.tableViewA);
    PO(self.tableViewA.delegate);
    PO(self);
    PO(self);
    [self.tableViewA reloadData]; //No delegate is called here

    self.tableViewA.contentInset = UIEdgeInsetsZero;//I break here
}

这就是我得到的结果,即确实填充了 lc.FetchController。但是,该表仍然是空的,因为根本没有调用提供节数、每个节中的行数的那些委托。

2012-06-06 15:16:08.152 BadgerNew[347:17303] <0x20abff00 listNewController.m:(235)> self: <listNewController: 0x20abff00>
2012-06-06 15:16:08.154 BadgerNew[347:17303] <0x20abff00 listNewController.m:(238)> lc.FetchController: <NSFetchedResultsController: 0xb2474fc0>
2012-06-06 15:16:08.156 BadgerNew[347:17303] <0x20abff00 listNewController.m:(239)> **fetchController.fetchedObjects.count 20**
2012-06-06 15:16:08.260 BadgerNew[347:17303] <0x20abff00 listNewController.m:(240)> lc.FetchController.fetchedObjects: (
    "<Business: 0x7486afc0>  bla bla bla (too long)"
)
2012-06-06 15:16:08.268 BadgerNew[347:17303] <0x20abff00 listNewController.m:(241)> self.tableViewA: <UITableView: 0x2dbdbd10; frame = (0 -4; 320 352); clipsToBounds = YES; autoresize = W+H; autoresizesSubviews = NO; layer = <CALayer: 0x2dbddfd0>; contentOffset: {0, 0}>
2012-06-06 15:16:08.271 BadgerNew[347:17303] <0x20abff00 listNewController.m:(242)> self.tableViewA.delegate: <listNewController: 0x20abff00>
2012-06-06 15:16:08.273 BadgerNew[347:17303] <0x20abff00 listNewController.m:(243)> self: <listNewController: 0x20abff00>
2012-06-06 15:16:08.275 BadgerNew[347:17303] <0x20abff00 listNewController.m:(244)> self: <listNewController: 0x20abff00>

我听说过问题是tableViewA 并没有真正指向正确的tableViewA 的情况。所以我在以下位置设置断点:

-(void) setTableViewA:(UITableView *)tableViewArg
{
    _tableViewA = tableViewArg;
}

-(UITableView *) tableViewA 
{
    return _tableViewA;
}

我验证 setTableViewA 仅被调用一次,即在加载视图控制器时,之后不再更改。

我想知道我是否可以做另一件事。

更新:我在 ReloadorRedraw 中将背景设置为蓝色,然后在加载时调用的其他函数中将其设置为红色。

ReloadorRedraw 被调用了两次。

第一次打开 viewController 时。第二个是加载完成后。

第一次打开 viewController 表确实是空的,背景变成蓝色。然后变成红色。然后当下载完成时它再次变成蓝色。

所以第二次,tableViewA 就是同一个tableViewA。代表仍然确实是控制器。我也检查过。

第一次:

2012-06-06 20:54:43.500 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(263)> lc.FetchController.fetchedObjects: (
)
2012-06-06 20:54:43.502 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(264)> self.tableViewA: <UITableView: 0x62e15d10; frame = (0 -4; 320 352); clipsToBounds = YES; autoresize = W+H; autoresizesSubviews = NO; layer = <CALayer: 0x62e17fd0>; contentOffset: {0, 0}>
2012-06-06 20:54:43.505 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(265)> self.tableViewA.delegate: <listNewController: 0x5cf0df00>
2012-06-06 20:54:43.507 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(266)> self: <listNewController: 0x5cf0df00>

第二次:

...lc.FetchController.fetchedObjects: ( tons of data here
    )
2012-06-06 20:55:26.734 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(264)> self.tableViewA: <UITableView: 0x62e15d10; frame = (0 -4; 320 352); clipsToBounds = YES; autoresize = W+H; autoresizesSubviews = NO; layer = <CALayer: 0x62e17fd0>; contentOffset: {0, 0}>
2012-06-06 20:55:26.737 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(265)> self.tableViewA.delegate: <listNewController: 0x5cf0df00>
2012-06-06 20:55:26.739 BadgerNew[5822:17303] <0x5cf0df00 listNewController.m:(266)> self: <listNewController: 0x5cf0df00>

更新:删除 tableViewA beginUpdates 和 endUpdates 解决了这个问题。基本上确保 fetch 控制器不做任何事情。

我认为由于折叠所有功能或其他原因,代码以某种方式搞砸了插入和退出问题。

4

0 回答 0