为啥在我的应用程序中使用 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 和数据源/委托。让controller
向tableView
询问其行数是错误的,因为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 将我的图像反转回原始图像