UITableView的cellForRowAtIndexPath方法从未被调用。

6

我在一个UIViewController的子视图中有一个UITableView。这个viewController的UI是通过storyboard进行管理的。必要时,委托和数据源会被设置为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 是 storyboard 中 UITableView 的 IBOutlet。
self.tableview.delegate = self;
self.tableview.dataSource = self;

找到答案了

我正在使用带有自动布局的故事板。问题在于,尽管故事板的其余部分设置为wAny hAny,但尺寸仍设置为wRegular hRegular。简单地切换这个设置就可以使它正常工作!虽然很荒谬,但这确实是一个答案。


此外,在这里 https://dev59.com/U2Af5IYBdhLWcg3wZB-u 有一个非常有趣的案例,即当调用此函数时可能出现无法被调用的情况。请查看一下。 - Oleshko
谢谢Oleshko - 代理和数据源已经在代码中设置好了。我尝试了关于约束的建议,但是没有任何改变。 - JordanMazurke
我最初尝试了这个方法,以查看是否存在某些隐藏的异常/问题,但无论cellForRowAtIndexPath是否存在都没有任何区别。 - JordanMazurke
你有检查我的答案吗? - Nischal Hada
你确认你的TableView实际上在屏幕上,并且你已经设置了行高吗? - Paulw11
显示剩余3条评论
5个回答

1
有一些情况下,委托方法没有被调用。因此,请首先通过调试工具检查您的设置,查看您的设置是否适当,例如检查表格视图、委托和数据源是否存在于内存中。如果您的数据源为空,表格视图甚至不会尝试调用,这与您的情况不同,因为您返回了某个数字。
通常,程序员们根据我之前所做和看到的内容犯了一些小错误。因此,请仔细检查您的代码。最好还要发布您的 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
作者的回答更新: 事实证明,在某些大小类别下,表格视图是不可见的。这就是为什么不会尝试,因为它根本不可见。这不是的错误,可以通过视图调试来检测。

1
委托和数据源方法已正确设置 - numberOfSectionsInTableView 和 numberOfRowsInSection 方法已正确调用。 - JordanMazurke
兄弟,我以前也遇到过这种问题,结果发现只是个愚蠢的错误。或者你能否提供更多信息,这样我们才能有效地帮助你。 - Lucas Huang
1
你的方法肯定是正确的,我过去也曾经因为这个问题而受挫,但这里并非如此。一切都设置正确了。还有什么其他信息可以帮助你来帮助我吗?谢谢。 - JordanMazurke

1
我正在使用带有自动布局的故事板。问题在于尺寸设置为wRegular hRegular,而其余故事板都设置为wAny hAny。简单地切换后它就可以工作了!我知道这很荒谬,但这是一个答案!

这个有效:
This works

这个无效: This doesnt

这让我疯狂了很长时间,我仍然不完全理解为什么这样做可以工作,但它确实可以。

现在我知道为什么委托方法没有被调用。因为在wRhR大小类中,您的表视图约束被卸载,因为可能不支持此大小。因此,在此大小类中,表视图将变为0高度。然后,iOS检测到它不可见。结果是iOS甚至不想尝试调用它,因为它是不可见的。这绝对不是苹果的错误。它是大小类字面上删除您的表视图。 - Lucas Huang
你需要自己解决问题,我们无法提供帮助。不过,很高兴看到你已经理解了。另一种检测的方法是使用视图调试器,你会看到你的表格视图在那个尺寸类别下是一条线。 - Lucas Huang

0

你确定你的dataSource和delegate设置为正确的类吗?在IB中很容易出错,特别是如果你复制/粘贴。在你的viewDidAppear方法中放置一个断点,然后在控制台调用

po self.tableView.dataSource

为了验证它在运行时已设置。


我在代码中设置了数据源和委托,所以这不可能是问题。而且,另外两个数据源方法被正确调用,所以链接肯定存在。 - JordanMazurke

0
你确定在界面构建器上设置了表视图输出口吗?即self.tableView != nil

0
在我的特定情况下,直到我将表视图的分隔符翻转为单行(之前设置为无),才会调用numberOfRowsInSection。然后,在我的heightForRowAtIndexPath方法中,我对一个字体进行了一些自定义大小计算,但字体名称错误导致出现问题。不确定这是否有助于任何人,但这就是发生在我身上的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接