为什么当我从一个视图控制器返回时,我的UITableView的格式完全错误?

我有一个自定义单元格的UITableView ,其中有几个标签,dynamic地决定单元格的高度。 当我点击一个单元格,并继续到一个新的视图控制器,返回所有格式的单元格是完全搞砸了,我不知道是什么原因造成的。

以下是单元格通常的样子:

在这里输入图像说明

我有一些基本的约束设置在他们身上。 顶部的标签被固定在顶部和左边缘,并且必须始终> 20。 其他标签与第一个标签的左侧alignment,在所有标签之间设置垂直间距。 中间标签对边距具有正确的间距约束,底部标签与第一个的基线alignment,并且在它们之间具有水平间距。

当我回到这个表格视图时,它看起来像这样:

在这里输入图像说明

我无法弄清楚是什么导致它的布局与我离开时不同。 如果我滚动它似乎“重置”他们回到他们应该是,但在初始加载他们真的搞砸了。 如果需要的话,我可以附加这个项目,但在Storyboard之外并没有太多的东西。

cellForRowAtIndexPath:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomTableViewCell let object = objects[indexPath.row] cell.title1.text = object.name cell.title2.text = object.color cell.title3.text = object.roar return cell } 

示例项目: http : //cl.ly/040L2z0q0V2d

从segue返回时,表格视图单元格不会根据内容resize。 使用示例项目,我在viewWillAppear中抛出了一个重载数据,这似乎解决了这个问题。

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.tableView.reloadData() } 

实际上你的项目有几个问题。

数据加载和自动布局

第一个是在用数据绘制单元格时引起一个奇怪的行为。 从segue展开时,由于模糊的布局计算,您会在桌面上看到这些额外的单元格。

解决scheme :将数据移动到override func viewWillAppear(animated: Bool) {并执行一个tableView.reloadData() (正如@rFessler所build议的那样)

另一方面, Autolayout是一种火热的野兽。 Tamable 。 进一步的研究是值得的。 我无法通过自动调整单元格高度来使您的布局工作,但我将为您留下几个参考和项目。


参考文献:

http://www.appcoda.com/self-sizing-cells/

http://captechconsulting.com/blog/tyler-tillage/ios-8-tutorial-series-auto-sizing-table-cells


项目: http : //cl.ly/3z3a2Z3a3U2K

我自己也有类似的问题。 我下载了你的项目,似乎我已经通过删除和调整一些约束来解决它。 这就是我现在的约束:

在这里输入图像说明

此外,我已经添加到viewDidLoad:

 self.tableView.estimatedRowHeight = 120 self.tableView.rowHeight = UITableViewAutomaticDimension 

我也添加了这个testing删除:

 override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { self.objects.removeAtIndex(indexPath.row) self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) } } 

现在,你甚至可以旋转设备,删除行,这一切都工作出色!


但是,如果您在导航控制器上推送此视图(这是我一开始就遇到的问题),仍然存在问题。 看到我的故事板下面得到一些时髦的标签:

在这里输入图像说明

为了解决这个问题,看来我们真的要做一个破解! (该死的你苹果,这是怎么回事?!)

 var firstAppearance=true override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if firstAppearance { if let indexPaths = self.tableView.indexPathsForVisibleRows() { self.tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None) self.firstAppearance = false } } } 

目前,我认为这是一样好。

我玩这个,find一个简单的解决scheme,添加这似乎解决了这个问题。

 override func viewWillDisappear(animated:Bool) { super.viewWillDisappear(animated) self.tableView.estimatedRowHeight = 166.0 } 

由于tableView:estimatedHeightForRowAtIndexPath方法会在您每次使用新的MVC时被调用,并改变自动布局,所以您可以

 override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

重用自动布局