2014-10-28 31 views
3

我有一个UITableView与自定义单元格,其中有几个标签,它动态地决定单元格的高度。当我点击一个单元格并继续到一个新的视图控制器时,返回单元格的所有格式完全搞砸了,我无法弄清楚是什么导致它。当我从一个视图控制器返回时,为什么我的UITableView的格式化完全出错?

这里是细胞正常的样子:

enter image description here

而且我对他们设置了一些非常基本的约束条件。顶部标签固定在顶部和左边距,并且从右侧始终应大于等于20。其他标签与第一个标签的左侧对齐,并在所有标签之间设置垂直间距。中间标签对边距有一个正确的间距约束,并且底部标签与第一个标签的基线对齐,并且它们之间具有水平间距。

当我Segue公司回到这个表中查看它看起来像这样但是:

enter image description here

我想不出是什么原因造成布局比我离开的时候是不同的。如果我滚动它似乎“重置”他们回到他们应该是,但在最初的负载他们真的搞砸了。如果需要,我可以附加该项目,但在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

+0

您可能还没有使用的'deQueueReusableCellWithIdentifier'。试试你的'cellForRowAtIndexPath'。 – 2014-10-28 14:11:32

+0

要添加到Libran编码器的建议,使用dequeueReusableCellWithIdentifier:atIndexPath: – 2014-10-28 14:17:09

+0

我相信我做这两个。我已将我的'cellForRowAtIndexPath'方法添加到主文章中。 – 2014-10-28 14:20:11

回答

3

看来,从SEGUE返回时表视图细胞没有尺寸调整基础上的内容。使用示例项目,我在viewWillAppear中抛出了一个重载数据,这似乎解决了这个问题。

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

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

数据加载自动版式

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

:将数据分成override func viewWillAppear(animated: Bool) {并执行tableView.reloadData()(如正确地@rFessler建议)

另一方面,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

1

我玩过这个,找到一个简单的解决方案,添加这似乎解决了这个问题。

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

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

enter image description here

而且我已经添加了这viewDidLoad中:

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

我还添加了这个测试删除:

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) 
    } 
} 

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


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

enter image description here

为了解决这个问题,看来我们确实需要做的一劈! (你这该死的苹果,到底是怎么回事这个?!)

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 
     } 
    } 
} 

此刻,我觉得这是好得不能再好。

0

由于该方法tableView:estimatedHeightForRowAtIndexPath都会被调用你Segue公司到一个新的MVC,并更改自动版式的时候,你可以做

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

重用自动版式

相关问题