为啥在我的应用程序中使用 numberOfRowsInSection 会导致永无止境的循环?

Posted

技术标签:

【中文标题】为啥在我的应用程序中使用 numberOfRowsInSection 会导致永无止境的循环?【英文标题】:Why is using numberOfRowsInSection causing a never ending loop in my app?为什么在我的应用程序中使用 numberOfRowsInSection 会导致永无止境的循环? 【发布时间】:2013-07-28 01:06:49 【问题描述】:

我遇到了我的单元格背景图像失真的问题,在having it answered 之后,我开始实施解决方案,该解决方案基本上包括缩短特定违规单元格的高度(自动添加高度)。我这样做如下:

- (CGFloat)tableView:(UITableView *)tableView 
  heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    CGFloat standardHeight = 44.0;

    if ([tableView numberOfRowsInSection:indexPath.section] == 1) 
        standardHeight -= 2;
    

    return standardHeight;

但是,每次我运行它时,我都会陷入某种执行循环,应用程序会在该方法的第一行和 if 语句的开头之间不断反弹,直到它崩溃。

视频:http://f.cl.ly/items/2F1E3r2A2p0y1b2j3R14/debug.mov

但是,如果我使用这样的东西(上一个帖子中的答案之一),它似乎可以工作:

- (CGFloat)tableView:(UITableView *)tableView 
  heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    CGFloat rowHeight = 44.0f;
    if (indexPath.row == 0) 
        rowHeight -=1;
    
    return rowHeight;

我做错了什么?我就是想不通。

【问题讨论】:

【参考方案1】:

这里的问题是您不应该依赖一个数据源/委托方法向另一个提供数据。本质上发生的是,您询问您的 tableView 它在一个部分中有多少行,何时应该从您的模型中获取此信息(这也是 numberOfRowsInSection: 应该从中获取信息的地方)

您的所有数据源方法都应该直接从模型返回数据,因为您的 tableView 可能会在意外时间向您的数据源询问数据。这不仅适用于UITableView,而且适用于所有基于数据源的视图,例如UICollectionView

【讨论】:

从我的模型中获取它是什么意思?在这种情况下,我创建的单元格很少(最多两个,通常一个),因为它是一个用于显示要登录的服务的表格。现在只有两个服务可以登录,所以它只是根据你还没有登录的服务来选择要显示的内容。 gist.github.com/anonymous/cdc55c17de14c97d9441 我是否必须将该逻辑重新实现到另一种方法中? :// 非常有趣的观察@Cezar.. 鉴于我过去遇到的一些我无法解释的错误,你所说的对我来说很有意义。您是否有一些关于此的官方文档或一些强调这一事实的教程?不管怎样,我给了你我的 +1 @DougSmith 您可以用不同的方法实现该逻辑,并从tableView:heightForRowAtIndexPath:numberOfRowsInSection 调用它。更好的是,您可以在初始化 TableViewController 时调用该方法,并将有关用户尚未登录的服务的信息存储到 TableViewController 中的属性中。 @abbood 抱歉,我找不到任何明确说明这一点的文档。但我上面描述的本质上是 MVC 和数据源/委托。让controllertableView 询问其行数是错误的,因为tableView 依赖于datasource(原来是controller 本身)从model 获取此信息. 为什么在这种情况下不只是将它视为私有辅助方法?如果您需要在一个类中重复执行某些操作,您可以将其批准为不同的方法并调用它,即使它是从同一个类中调用的。如何要求数据源执行少量逻辑然后返回一个导致这样麻烦的数字?为什么不直接返回值?【参考方案2】:

您可以这样做,而不是从 tableView 调用 numberOfRowsInSection: 方法:

if ([self tableView:tableView numberOfRowsInSection:indexPath.section] == 1) 
    standardHeight -= 2;

这将是安全的,因为它只调用您自己的代码。

【讨论】:

以上是关于为啥在我的应用程序中使用 numberOfRowsInSection 会导致永无止境的循环?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我的应用程序中使用 numberOfRowsInSection 会导致永无止境的循环?

为啥在我的 web 应用程序中使用 Tomcat 时出现 Class NotFound Exception?

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?

为啥我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像

为啥我无法在我的 React 应用程序中访问 Konva Canvas 属性?

为啥我两次被要求在我的 iPhone Web 应用程序中使用 GPS