UITableView cellForRowAtIndexPath 从未调用
Posted
技术标签:
【中文标题】UITableView cellForRowAtIndexPath 从未调用【英文标题】:UITableView cellForRowAtIndexPath never called 【发布时间】:2015-06-20 21:02:14 【问题描述】:我有一个UITableView
作为UIViewController
的子视图。 viewController UI 通过故事板进行管理。根据需要将委托和数据源设置为viewController。
我有以下代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
if (updateType == Profile)
return 15;
else
return 6;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 1;
上述两个方法被完全调用。调用[self.tableview reloadData]
会导致再次调用方法。令人费解的是,- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
从未被调用过。永远。
数据源和委托在代码中设置,其中self.tableview
是情节提要中UITableView
的IBOutlet:
self.tableview.delegate = self;
self.tableview.dataSource = self;
找到答案
我正在使用带有自动布局的情节提要。问题是尽管故事板的其余部分设置为 wAny hAny,但尺寸设置为 wRegular hRegular。只需切换它就可以了!我知道这很荒谬,但这仍然是一个答案。
【问题讨论】:
尝试在代码中设置委托和数据源,看看是否有帮助。 另外,这里的***.com/questions/24698313/… 是这个函数不能被调用的非常有趣的例子。检查一下。 感谢 Oleshko - 委托和数据源已在代码中设置。我尝试了重新限制的建议,但没有任何区别。 嗯...尝试完全删除 cellForRowAtIndexPath 方法,看看您是否会收到一些警告,表明此方法未实现。 我最初尝试过,看看是否有一些隐藏的异常/问题,但 cellForRowAtIndexPath 是否存在没有区别 【参考方案1】:我正在使用带有自动布局的情节提要。问题是尽管故事板的其余部分设置为 wAny hAny,但尺寸设置为 wRegular hRegular。只需切换它就可以了!我知道这很荒谬,但这仍然是一个答案!
这行得通:
这不是:
这让我疯狂太久了,我仍然不完全理解为什么它有效的机制,但它确实有效。
【讨论】:
现在,我明白为什么不调用委托方法了。因为在 wRhR 大小类中,您的表视图的约束被卸载,因为您可能不支持此大小。因此,在这个尺寸等级中,表格视图将变为 0 高度。然后,ios 检测到它不是可视的。事实证明,iOS 甚至不想尝试调用它,因为它是不可见的。这绝对不是 Apple 的错误。它是从字面上删除您的表格视图的大小类。 你自己解决,我们没办法帮你。无论如何,很高兴看到这是有道理的。另一种检测方法是使用视图调试,您将看到您的表格视图是该尺寸类下的一行。【参考方案2】:在少数情况下,委托方法没有被调用。因此,首先通过调试工具检查您的设置,看看您的设置是否合适,例如检查内存中是否存在 table view、delegate 和 dataSource。如果您的数据源为空,则表格视图甚至不会尝试调用这不是您的情况,因为您确实返回了某个数字。
通常,这只是程序员根据我之前所做和所见所犯的一个小错误。因此,请仔细检查您的代码。你最好张贴你的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
也是。
作者回答的更新: 事实证明,表格视图在某些尺寸等级下是不可见的。这就是为什么 iOS 甚至不会尝试,因为它根本不可见。这不是 Apple 的错误,可以通过查看调试检测到。
【讨论】:
委托和数据源方法设置正确 - numberOfSectionsInTableView 和 numberOfRowsInSection 方法被正确调用。 伙计,我以前去过那里,结果证明这只是愚蠢的错误。或者你能不能给我更多的信息,以便我们能有效地帮助你。 你的方法绝对是正确的,我过去一直被这件事烧死,但这里不是这样。一切都设置正确。还有哪些信息可以帮助您帮助我?谢谢【参考方案3】:您确定您的数据源和委托设置为正确的类吗?在 IB 中很容易犯错,尤其是复制/粘贴时。在您的 viewDidAppear 方法中放置一个断点,然后在控制台调用中
po self.tableView.dataSource
验证它是否在运行时设置。
【讨论】:
我在代码中设置了数据源和委托,所以这不是问题。此外,其他两个数据源方法被正确调用,因此链接肯定存在。【参考方案4】:您确定在界面生成器上设置了表格视图出口吗?即self.tableView != nil
【讨论】:
【参考方案5】:在我的特殊情况下,只有 numberOfRowsInSection 被调用,直到我出于某种原因将 tableview 上的分隔符翻转为单行(设置为无),然后我的 heightForRowAtIndexPath 被调用,在那里我进行了一些自定义大小计算在字体名称错误的字体上,这使它翻转。不确定这是否对任何人有帮助,但这就是发生在我身上的事情。
【讨论】:
以上是关于UITableView cellForRowAtIndexPath 从未调用的主要内容,如果未能解决你的问题,请参考以下文章
在 ViewWillAppear 完成运行之前调用 CellForRowAtIndexPath
在 UITableViewCell 中调整 UITextView 的大小
UITableViewCell 中的 UIButton 不可点击