UITableView reloadData有时不会调用委托

时间:2012-06-06 08:42:57

标签: objective-c ios xcode xcode4.3

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

这是我使用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只被调用一次,即当viewcontroller加载时,之后永远不会改变。

我想知道我还能做些什么。

更新:我在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修复问题。基本上要确保获取控制器没有做任何事情。

我认为代码因为崩溃所有功能或其他东西而导致插入和退出问题不知所措。

0 个答案:

没有答案