CellForRowAtIndexPath: 未调用

我的应用程序有两种状态: 登录和不登录,我有以下架构(大大简化) :
- 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:中的断点将永远不会被触及。

58921 次浏览

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

如果将 B 显示为模态控制器,那么当您取消它时,就不会调用 viewWillAppear方法。

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

为什么要调用 numberOfRowsInSection而不调用 cellForRowAtIndexPath的一个有效场景是,当表的大小或位置不需要显示任何行时。

例如,假设您有一个20像素高的表,但是第一部分的标题是30像素高,并且您为标题返回了 null (或者没有实现 viewForHeaderInSection)。在这种情况下,不会显示任何行,而且看起来就像表不存在一样。

我看到你在用 IB。在 IB 中,表的大小可能具有欺骗性,因为它假设页眉和页脚的大小。我将记录表的框架,这样您就可以了解应用程序运行时它在哪里(相对于它出现在 IB 中的位置)。我还要确保手动调用 reloadData 的表的帧 之前的大小和位置。这将解决不调用 cellForRowAtIndexPath的有效情况。

检查 numberOfSectionsInTableView是否返回0。

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

我遇到了完全相同的问题,问题是我试图从另一个线程调用 reloadData: 。解决办法是:

dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});

尝试手动插入新行而不是 [self.tableView reloadData]:

[self.tableView beginUpdates];
for (int i = 0; i < responseArray.count; i++) {
_rowsNumber += 1;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
}
[self.tableView endUpdates];

在 dataSource 方法中,返回递增的 int _rowsNumber:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _rowsNumber;
}

我在用 ReactiveCocoa。因此,我已经为表视图创建了模型。数据已准备好显示,因此调用了 numberOfRows等。但是我没有添加 tableview 作为 subview,因此没有调用 cellForRowAtIndexPath))

// 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;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Make sure self.data isn't nil!
// If it is, you'll always return 0 and therefore
// cellForRowAtIndexPath will never get called.
return [self.data count];
}

我解决了这个问题,因为我添加了 UITableView的 Subview 没有被分配,所以它返回的结果是 null,tableview 没有调用 cellForRowAtIndexPath,而是调用了 numberOfRowsInSection

如果视图中的表视图与 Scrool 视图之类的视图冲突,则不调用。您应该将故事板中的视图分开,或者 * 。十一号文件。

// True
▼ View
► Table View
► Scrool View
► Constraints


// False
▼ View
► Scrool View
► Table View
► Constraints

我通过检查 tableViewCell 标识符解决了同样的问题。转到属性 nspector 并查看标识符部分。可能失踪了。写入单元格标识符。

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

我正在使用一个客户数据源,它被释放。因为它是一个薄弱的参考表视图。

每个人都在谈论高度,但是我的 TableViewStackView的前导对齐结束时宽度为0。

确保使用 Debug View Hierarchy检查 TableView的大小是否正确。

同样的情况,但这是个错误:

我在 ViewController (设计要求)中包含了一个带有2个 tablesView 的 Scrollview,在 Scrollview 控制器中,我通过编程创建了 ViewController (包含 TableView) ,我使用了 弱变量来存储它,坏主意,因为它们是在 viewDidLoad 方法的末尾发布的。

如果您没有看到表格视图的内容,请检查它是否已经发布。

我的错误对我来说是非常痛苦的,因为所有的方法(委托和数据源)都被调用,除了 viewForCell..。

我也有同样的问题 我已经在 StackView 中使用了 Table View,并且表视图滚动禁用并且设置了高度限制,但是在那之后

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

不工作停止调用这个方法所有的 Data SourceDelegate设置正确。

如果与解决方案有相同的问题,则设置表视图底部、前导、尾随约束

enter image description here

这里没有一个答案对我有帮助。

我用编程的方式做我的约束,但是忘了写:

myTableView.translatesAutoresizingMaskIntoConstraints = false

这是尴尬和困惑,但这是我的解决办法。

我的代码:

_scanResultTable.delegate = self;
_scanResultTable.dataSource = self; // self's lifecycle was fine, wasn't getting released
[_scanResultTable reloadData];

因此,奇怪的地方在于: 在我的代码中,在项目的任何地方,都没有声明 Identity _ ScanResultTable。我不知道这是如何编译的(我重新编译了好几次)。

我的根本原因是我在 ViewController 中将表输出链接到 scanResultTable,但是将其称为 _ ScanResultTable。一旦我开始像我应该的那样使用 scanResultTable,事情就清楚了。这让我想知道,在标识符中引导下划线时,Objective-c 是否有什么特别之处... ..。

编辑: 是的! 天哪,我等不及再也不碰这门语言了。

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

tableView?.translatesAutoresizingMaskIntoConstraints = false

我这边犯了个愚蠢的错误。

确保您的约束是正确的,并且在构建时没有删除任何约束。

在我的例子中,我把 TableView放在一个 StackView中,当我把它放在 StackView 外面时,它工作了。

这可能太明显了,但是在我的例子中,我删除了一个元素(Label) ,这个元素是程序化地引用我的表的顶部边距,所以这不是委托/源的问题,而是表在内容大小/高度方面有一些问题,这个冲突产生了一个奇怪的行为,调用 numberOfRowsInSection 而不是 cellForRowAt indexPath

浪费了几个小时,然后发现我的桌面视图在一个堆叠视图里面。我一把 Stackview 移除,就立马见效了。对我来说是 Xcode 11.3。

我们有相同/相似的问题。代码到达了 numberOfSectionsnumberOfRowsInSection(甚至还返回了值) ,但是无法到达 cellForRowAt。当时,故事板中的表格视图只对右侧、左侧和顶部有约束,而对底部没有约束。一旦我们在底部加上约束,它就像魔法一样起作用了。

因此,请检查是否为表视图提供了所有需要的约束。