Answers:
强迫返回高度和估计高度使警告消失了。
- (CGFloat)tableView:(UITableView *)tableView
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
不需要这两个替代的另一个解决方案是仅self.tableView.rowHeight = 44;
在您的loadView
init方法中使用。
还可以做的是在内容视图的顶部和底部添加垂直约束。这将使自动布局开心(因为他现在知道如何自己计算单元的高度)。
如果您使用的是autoLayout约束和UITableViewAutomaticDimension,则此错误不是通过覆盖代码中的高度而被丢弃的一些错误问题。这意味着无法自动确定像元高度,因为您没有适当的垂直约束。
如果您像我一样遇到此错误,并且需要帮助来确定哪个单元引发了该错误,则可以在返回“ heightforRowAtIndexPath”方法之前添加以下行。
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
这将打印出一长串的节和行,但是该错误将立即出现在导致该错误的特定单元格之后,并且您可以快速识别出哪个单元格导致了该问题并相应地解决约束。这对于静态单元格特别有用。如果您不使用autoLayout和自动单元格高度,则使用手动输入的数字替代高度是可行的,但是实际上将禁用这些功能,如果您尝试利用某些功能,则这是一个非常差的解决方案。
如果您以前没有使用过'heightForRowAtIndexPath'方法,但是想在不撤消UITableViewAutomaticDimension设置的情况下调试此错误,只需将其添加到代码中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
return UITableViewAutomaticDimension;
}
XCode 6.1中似乎存在一个错误,如果使用自动布局会导致此问题,并且您没有为每个表格视图单元格的行高指定一个值,而是保留了“默认”值。只需选中每个单元格“行高”旁边的“自定义”复选框,警告就会消失。
是的,即使在表格视图单元格中只有水平约束的情况下,您也会获得所有约束“满意”。我有同样的问题。您还需要添加垂直约束。这样做,该警告将消失。
约束可以出于布局目的而满足,但出于自动行高目的而并不满足。满意的布局意味着可以毫无歧义地布局内容。这将满足Interface Builder中的检查。
自动行高的令人满意的布局将意味着,除了上述内容之外,您还将约束单元格底部。
此处提供更多信息:检测到约束不明确地表明高度为零的情况
我无法删除警告,但是为了使约束起作用,我将,new设置为iOS8,将tableview属性estimatedRowHeight
设置为固定高度,并删除了heightForRowAtIndexPath
实现。
如果收到该警告,则最有可能是因为您使用的是自动布局,并且单元格内部没有任何约束。
您应该停止使用自动布局,或者实施明确定义单元格高度的约束。
您可以通过取消选中右侧文件检查器中的“使用自动布局”选项来在界面构建器中关闭自动布局。
如果您选择使用自动布局并且单元格的高度是固定的,则实施适当的约束应该很容易。只需为单元格内容视图的子视图添加高度约束,并在子视图之间以及子视图与内容视图之间实现垂直空间约束。例如,如果您的单元格中有一个标签,则可以使用:
垂直约束
水平约束
您可以使用自动版式为您计算合适的高度。这是一篇关于iOS 8动态单元格高度的好文章:http : //natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
对于沼泽标准修补程序,没有约束,没有估计高度或过度设计了问题。我创建了一个默认项目,将tableview连接起来,但是忘记将高度委托放到view controller中。要简单地使此警告消失,您需要此。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 44;
}
在表的视图控制器中。
尽管此页面上的讨论讨论添加高度约束或手动返回heightHoldRowAtIndexPath中的44之类的rowHeights导致警告消失,但它们是多余的,因为这是Xcode中的错误,至少在版本6.3.2(6D2105)中可见。
如果在viewDidLoad中设置断点,即使在情节提要中指定行高为44,也会看到self.tableView.rowHeight = -1(UITableViewAutomaticDimension)。这是因为如果将行高保留为44,Apple会错误地假定您想要动态行高,因为它们没有为您提供用于指定首选项的标志。
以下是一些可能的解决方案及其结果:
在情节提要中将行高设置为43或45(有效)。
手动返回heightForRowAtIndexPath中的高度44(有效)。
在UITableViewCell的元素及其contentView之间添加高度限制(有效)。
不幸的是,这些解决方案要么要求您更改设计,添加不必要的约束,要么添加不必要的代码来解决错误。我尝试了(我认为是)最简单的解决方案:
我真的想要一个纯粹的情节提要解决方案,所以最后我尝试了:

这些错误在iOS开发中太常见了,迫使开发人员花费大量时间来衡量其解决方案从长远来看将如何影响可维护性。
由于很难找到一种在概念上可维护且不会混淆的正确解决方案,并且假设Apple将修复该错误并且在可预见的将来将44作为默认行高,则应使用约束或用户定义运行时属性解决方案可能是最可维护的。
我认为,这里发生了两件重要的事情。
1)如果您按住Ctrl +拖动,则使约束错误的方法非常容易。因此,请仔细检查您的设置是否正确。最好使用屏幕左侧的托盘绘制这些约束。
2)使用委托方法代替在ViewDidLoad或其他地方指定estimatedRowHeight
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}
这立即为我解决了问题。