我的应用程序具有两种状态:已登录和未登录,并且我具有以下架构(大大简化了):
-ViewController A,其中包含搜索框和表格 View 。
-用于登录应用程序的ViewControllerB。
流程如下:
-用户未登录;
-A被压入堆栈。在viewWillAppear
中,我检查用户是否已登录,如果是,则正在发出异步网络请求,完成后,该表将从网络中装入数据。但是,由于此时用户尚未登录,因此表 View 为空;因此,表 View 为空。
-用户点击搜索框;因为他尚未登录,所以B被推送(在确认之后);
-他成功登录B,然后按一个按钮,弹出B并再次显示A;
-此时,由于他已登录,因此我从viewWillAppear
发出了异步请求;
-完成后,我在表格 View 上调用reloadData
。
我注意到的是,调用了numberOfRowsInSection:
并返回了正确的结果,但是此后未调用cellForRowAtIndexPath:
,该表仍然为空。
我已经检查过,并在主线程上调用了reloadData
。
知道会是什么吗?因为它让我发疯!
谢谢,
S.
编辑:这是来自A中viewWillAppear
的代码的异步位。
if ([User isLoggedIn]) {
[self.asyncRequest fetchDataWithCompletionHandler:^(id response, NSError *error) {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
if (error) {
[Utils displayError:error];
} else {
self.array = response;
self.isLoaded = YES;
[self.tableView reloadData];
[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:NO];
}
}];
}
我检查了异步请求是否成功完成,并且
response
包含正确的数据(这是用于支持UITableView
的数组)。在
reloadData
之后,我在tableView:numberOfRowsInSection:
中放置了一个断点,并在此停了下来,并在array
中返回了正确数量的元素。但是,此后,永远不会命中tableView:cellForRowAtIndexPath:
的断点。 最佳答案
为什么调用numberOfRowsInSection
但不调用cellForRowAtIndexPath
的一种有效方案是表的大小或位置不需要显示任何行时。
例如,假设您有一个桌子,桌子高20像素,但第一部分的标题高30,然后您为标题返回nil(或未实现viewForHeaderInSection
)。在这种情况下,将不会显示任何行,并且看起来好像表格不存在。
我看到您正在使用IB。表的大小在IB中可能具有欺骗性,因为它假定页眉和页脚的大小。我将记录表格的框架,以便您了解运行应用程序时的位置(相对于IB中出现的位置)。我还要确保在调用reloadData之前手动调整表框架的大小和位置。这将解决这种不调用cellForRowAtIndexPath
的有效情况。