如何在不违反AutoLayout约束的情况下隐藏UITableViewCells

问题描述:

我目前正在开发一款应用程序来学习iOS编程和Swift。我有一个视图,它包含两个主要的子视图,一个MKMapView和一个UITableView。当在MapView中选择某个注释时,我想要隐藏TableView中的某些单元格。如果注释被取消选中,单元格应该重新出现。目前我通过将单元格的高度设置为0并调用tableView.beginUpdates()tableView.endUpdates()来实现此目的,但这会导致我的自定义单元格内的各种AutoLayout约束条件被破坏。在将高度设置为0之前,我也尝试将单元格上的隐藏属性设置为true,但AutoLayout约束仍然被破坏。如何在不违反AutoLayout约束的情况下隐藏UITableViewCells

什么是正确的方法来做到这一点?

在此先感谢。

+0

将两个不同的数组保存为表视图数据源是一个好方法。第一个包含所有可以显示的数据。第二个是表视图的真正的数组数据源。单击注释时,可以通过从第一个数组获取数据来更新第二个数组(插入或删除必须或不显示的数据)。表格视图只会在最后重新加载。 –

+0

这就是我最初实现ViewController的方式,但我无法弄清楚当第二个数组更新时如何为单元格消失设置动画。我愿意提供关于如何为这种改变制作动画的建议。 –

我的2美分:只是尝试的冲突的制约因素之一的优先级降低到较低的值,如UILayoutPriorityDefaultHigh(如果在Interface Builder中使用750)或更低,则取决于单元格的组成方式。 它应该足以让自动布局系统知道哪些约束可以被安全地破解。可能您会想要打破定义距底部边距的距离的限制。

+0

这确实是限制从底部到给出麻烦的距离的限制。我用另一个约束替换它,导致相同的布局。谢谢! –

实施heightForRowAtIndexPath:像下面一样。还需要高度的限制设置为0

Objc版本

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (shouldHideCell) 
     return 0; 
    } 
    else { 
     return UITableViewAutomaticDimension; 
    } 
} 

斯威夫特版本

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if shouldHideCell { 
      return 0 
     } else { 
      return UITableViewAutomaticDimension 
     } 
    } 
+0

啊我应该更清楚哪些限制被打破。当高度设置为0时,单元格内的约束被破坏。顺便说一下,Swift中的行不应以';'结尾。 –

+0

我不是一个快速的开发人员。现在它已被删除。当通过默认高度限制启用自动布局的单元格被添加到单元格的内容视图中时。当你没有实现'heightForRowAtIndexPath()',约束与你的子约束的0约束视图冲突 – Rajesh

+0

我通过用不太紧密的约束替换了某个约束来解决问题,但仍然完成了工作,谢谢你的帮助。 –