我有一个简单的应用程序,我有一个表视图和&根据数组的回调,我使用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}>
答案 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!