在调用reloadData时调用numberOfRowsInSection后,有时不会调用cellForRowAtIndexPath

时间:2011-05-05 08:50:42

标签: iphone cocoa-touch uitableview

我有一个简单的应用程序,我有一个表视图和&根据数组的回调,我使用reloadData方法重新加载表数据。最初加载前5-10次这个表视图没有任何问题。在使用应用程序之后,有时我注意到表视图是空白的,因为框架没有调用cellForRowAtIndexPath。我核实了datasource& delegate已正确设置& numberOfRowsInSection正在返回有效的正数。一旦我看到空白表视图,我就可以反复看到这个空白视图,直到我退出应用程序。我在控制台中没有收到任何错误或警告。我试图调整阵列,但无济于事。

以下是代码:

- (void)notifyArrayLoaded:(NSArray *)arr {
    NSUInteger capacity = [arr count];
    _tbDataArray = [[NSMutableArray alloc] initWithCapacity:capacity];

    // _tbDataArray is filled with the data from arr

    // Reload the table data
    [_tableView reloadData]; 
}

任何线索都将受到高度赞赏。

提前致谢。 萨米特

DeanWombourne,我没有viewDidUnLoad方法,但我有viewWillDisAppear方法,我在这里发布它。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
    [self.navigationController setNavigationBarHidden:NO animated:NO];

    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];

    view.transform = CGAffineTransformIdentity;
    view.transform = CGAffineTransformMakeRotation(0);
    view.bounds = CGRectMake(0.0, 0.0, 320, 480);
}

这是记录的tableView日志。

[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
<UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>

5 个答案:

答案 0 :(得分:10)

确保在主线程上调用reloadData。如果您使用performSelectorInBackground异步加载数据并在该方法中调用reloadData,则应该执行以下操作:

[tableViewController reloadData]

你应该做的是

[tableViewController performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]

答案 1 :(得分:5)

如果reloadData导致numberOfRowsInSection被调用而不是cellForRowAtIndexPath,请检查您调用的UITableView实例reloadData是否相同{{1}您在视图中显示的内容,例如

UITableView

我想你会发现你有两个不同的NSLog(@"Calling reloadData on %@", self.tableView); [self.tableView reloadData]; 。这个难题正在解决为什么......

答案 2 :(得分:0)

转到viewcontroller的头文件并将(IBOutlet)添加到tableView成员。 然后通过interfaceb连接

答案 3 :(得分:0)

这可能为时已晚,但无论如何这可能有所帮助。我遇到了同样的问题。

总之可能是“Florian Segginger”的答案是对的。

我的情况是 1.异步调用Web服务以获取数据(拉动刷新) 2.这是处理,移动到另一个视图控制器(推) 3.回到我的应用程序崩溃。

因此,在第2步和第3步之间,我注意到实际调用了表的行数和节数,但是行的单元格没有。当我在表格单元的计数发生变化时弹回时,它恢复了另一个逻辑。通过测试处理这个问题,如果视图在连接中可见,确实完成加载,因为我在视图中重新加载表会出现。这可能是由于行的单元格实际上是一个应该在主线程上运行的渲染(UI)动作

答案 4 :(得分:0)

我也有同样的症状。在我的例子中,我第一次在viewDidLoad中加载数据(来自核心数据),NSSortDescriptor用于对数据进行排序。

单击按钮,再次获取核心数据(这次更改)并重新加载tableView数据。单击按钮后,它最初给了我一个空白的表格视图,因为我第二次拿到它时忘了对数据进行排序。

学习要点:如果您在开始时使用它们,请记住调用所有修改单元格的方法,如NSSortDescriptor!