![](/img/trans.png)
[英]cellForRowAtIndexPath not called after reloadData in AppDelegate
[英]cellForRowAtIndexPath is not called sometimes after calling numberOfRowsInSection on calling reloadData
我有一个简单的应用程序,其中有一个表格视图,并且取决于带有数组的回调,我使用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}>
确保在主线程上调用 reloadData。 如果您使用performSelectorInBackground
异步加载数据并在该方法中调用reloadData
,您应该,而不是执行以下操作:
[tableViewController reloadData]
你应该做的是
[tableViewController performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]
如果reloadData
导致调用numberOfRowsInSection
而不是cellForRowAtIndexPath
,请检查您调用reloadData
的UITableView
实例是否与您在视图中显示的UITableView
相同,例如
NSLog(@"Calling reloadData on %@", self.tableView);
[self.tableView reloadData];
我想你会发现你有两个不同的UITableViews
。 然后谜题就是为什么……
这可能为时已晚,但无论如何这可能会有所帮助。我遇到了同样的问题。
简而言之,“Florian Segginger”的答案可能是正确的。
我的情况是 1. 异步调用 web 服务以获取数据(拉动刷新) 2. 在处理过程中,移动到另一个视图 controller (推送) 3. 弹回来,我的应用程序崩溃了。
因此,在第 2 步和第 3 步之间,我注意到实际上调用了表的行数和节数,但没有调用行的单元格。当我在 tablecell 的计数由于另一个逻辑而改变时弹出回来时,它恢复了。通过测试处理此问题,如果视图在连接中可见,则确实完成加载,因为我正在重新加载视图中的表。这可能是由于行的单元格实际上是应该在主线程上运行的渲染(UI)操作。
我也有同样的症状。 就我而言,我第一次在 viewDidLoad 中加载数据(来自核心数据)时,使用 NSSortDescriptor 对数据进行排序。
点击一个按钮,核心数据被再次获取(这次有变化)并重新加载了 tableView 数据。 单击按钮后,它最初给了我一个空白表格视图,因为我第二次获取数据时忘记对数据进行排序。
学习要点:如果你一开始使用过NSSortDescriptor等修改单元格的方法,记得调用它们!
go 到 viewcontroller 的 header 文件,并将 (IBOutlet) 添加到 tableView 成员。 然后通过接口b连接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.