我的应用程序具有两种状态:已登录和未登录,并且我具有以下架构(大大简化了):
-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的有效情况。

10-07 19:26
查看更多