我的应用程序有两种状态: 登录和不登录,我有以下架构(大大简化) :
- ViewController 包含一个搜索框和一个表格视图。
- ViewController B,用于登录应用程序。
流程如下:
- 用户没有登入;
A 被推到堆栈上。在 viewWillAppear
中,我检查用户是否已经登录,如果是,则发出一个异步网络请求,一旦发出请求,表中就会加载来自网络的数据。但是,由于此时用户尚未登录,表视图为空;
- 用户点击搜索框; 因为他没有登录,B 被推出(在确认后) ;
- 他成功登录到 B,然后按下一个按钮,弹出 B,再次显示 A;
此时,因为他已经登录了,我从 viewWillAppear
发出异步请求;
完成后,我在表格视图中调用 reloadData
。
我注意到的是,numberOfRowsInSection:
被调用并返回正确的结果,然而 cellForRowAtIndexPath:
之后并没有被调用,表仍然是空的。
我已经检查过了,reloadData
是在主线程上调用的。
知道是什么吗? 我快疯了!
谢谢,
是的。
编辑: 下面是 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:
中的断点将永远不会被触及。