cellForRowAtIndexPath:未调用

Ste*_*ncu 66 iphone uitableview ios

我的应用程序有两种状态:登录和未登录,我有以下架构(大大简化):
- ViewController A包含一个搜索框和一个表视图.
- ViewController B,用于登录应用程序.

流程如下:
- 用户未登录;
- A被推入堆栈.在viewWillAppear我检查,如果用户在如果是,一个异步网络请求正在取得,一旦做到这一点登录,该表加载来自网络的数据.但是,由于此时用户未登录,因此表视图为空;
- 用户点击搜索框; 因为他没有登录,B被推(确认后);
- 他在B中成功登录,然后按下弹出B的按钮并再次显示A;
- 在这个时间点,因为他已登录,从viewWillAppear我做异步请求;
- 完成后,我调用reloadData表格视图.

我注意到的numberOfRowsInSection:是调用它并返回正确的结果,但cellForRowAtIndexPath:之后不会调用它并且表保持为空.

我已经检查并reloadData在主线程上调用了.

知道它能是什么吗?因为它让我疯了!

谢谢,
S.

编辑:这是viewWillAppearA 中代码的异步位.

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];
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

我已经检查过异步请求是否成功完成并且response包含正确的数据(这是用于支持的数组UITableView).

之后reloadData,我放了一个断点tableView:numberOfRowsInSection:,它停在那里,它返回正确数量的元素array.然而,在那之后,断点tableView:cellForRowAtIndexPath:就永远不会被击中.

Joe*_*oel 254

为什么numberOfRowsInSection会被调用但cellForRowAtIndexPath不会被调用的一个有效方案是当表的大小或位置不需要显示任何行时.

例如,假设你有一个20像素高的表,但是第一部分的标题是30高,你为标题返回nil(或者没有实现viewForHeaderInSection).在这种情况下,不会显示任何行,看起来就像表中没有行.

我看到你正在使用IB.表中的大小可以在IB中具有欺骗性,因为它假设页眉和页脚大小.我会记录表的框架,以便您了解应用程序运行时的位置(与IB中出现的位置相比).我还要确保调用reloadData 之前手动调整表格框架的大小和位置.这将解决cellForRowAtIndexPath未调用的有效情况.

  • 这家伙知道他在说什么. (63认同)
  • 我讨厌让Xcode提出视图约束。我的表视图由于建议的$#!tty约束而从未出现。更改了约束,一切运行正常。 (2认同)

Pet*_*lly 41

检查numberOfSectionsInTableView是否没有返回0.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 根据Apple"默认值为1".不需要此方法. (6认同)
  • 在回答这个问题时绝对需要它. (4认同)
  • 我遇到了与原作者相同的问题.此方法返回1,如您的答案所示,并且正在调用...但未调用cellForRowAtIndexPath.数据源和委托通过Interface Builder设置为文件的所有者; 我甚至尝试通过代码设置它(tableView.delegate = self)并且仍然没有调用它.我只是认为我会贡献这些因素,因为作者还没有接受答案,但你似乎走在了正确的轨道上.希望有人能想出来! (2认同)

Nik*_*kov 24

我有完全相同的问题,问题是我试图从另一个线程调用reloadData:解决方案是:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});
Run Code Online (Sandbox Code Playgroud)


ava*_*nce 13

如果您使用的是其他数据源,请确保保留dataSource.仅仅实例化将成为dataSource并通过其分配的类tableView.dataSource = myDataClass是不够的,因为tableView的dataSource属性很弱并且将在viewDidLoad完成时释放.所有其他方法都被我调用 - 甚至,令人惊讶的是heightForRowAtIndexPath- 所以这花了我一些时间来调试.


Joh*_*rck 12

// For others showing up on this questions via Google, etc.
// Check and make sure you've set the table view's data source and delegate.
self.tableView.dataSource = self;
self.tableView.delegate = self;
Run Code Online (Sandbox Code Playgroud)


小智 10

如果视图中的表视图与Scrool View之类的内容发生冲突,则不会调用它.您应该在Storyboard或*.xib文件中分隔视图.

// True
    ? View
        ? Table View
        ? Scrool View
        ? Constraints

// False
    ? View
        ? Scrool View
            ? Table View
        ? Constraints
Run Code Online (Sandbox Code Playgroud)


Anu*_*man 6

如果您像我一样使用自动布局并将 tableview 添加到视图控制器的视图中,请确保在分配 table view 时添加了这一行。

tableView?.translatesAutoresizingMaskIntoConstraints = false
Run Code Online (Sandbox Code Playgroud)

我这边犯了愚蠢的错误。


小智 5

我们有相同/相似的问题。代码达到了numberOfSectionsnumberOfRowsInSection(甚至返回了值)但无法达到cellForRowAt。当时,Storyboard 中的 Table View 只有右侧、左侧和顶部的约束,而没有底部的约束。一旦我们在底部添加约束,它就像一个魅力。

因此,请检查您是否为 Table View 提供了所有需要的约束。


And*_*scu 0

您确定在用户登录并弹出 B 后,viewWillAppear会调用 A 中的方法来执行刷新吗?

如果将 B 显示为模态控制器,则当您关闭它时,将不会调用该viewWillAppear方法。

据我所知,viewWillAppear/viewDidAppear(以及其他类似的)是 UINavigationController 在导航事件(推送/弹出视图控制器)的情况下生成的事件。所以也许这就是为什么当你离开 A 并返回时你最终会得到刷新......这一切都取决于显示下一个视图控制器的方式。