【问题标题】:Why does my UITableView's formatting go completely awry when I return from a view controller I segued to?当我从我选择的视图控制器返回时,为什么我的 UITableView 的格式会完全出错?
【发布时间】:2014-12-23 23:31:03
【问题描述】:

我有一个带有自定义单元格的UITableView,其中有一些标签可以动态决定单元格的高度。当我点击一个单元格并转到一个新的视图控制器时,在返回单元格的所有格式时完全搞砸了,我不知道是什么原因造成的。

下面是细胞通常的样子:

我对它们设置了一些非常基本的约束。顶部标签固定在顶部和左侧边距,并且必须始终从右侧 >= 20。其他标签与第一个标签的左侧对齐,所有标签之间设置了垂直间距。中间标签对边距有一个右间距约束,底部标签与第一个标签的基线对齐,并且它们之间有水平间距。

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

我无法弄清楚是什么导致它的布局与我离开时不同。如果我滚动它似乎将它们“重置”回应有的状态,但在初始加载时它们真的搞砸了。如果需要,我可以附加项目,但故事板之外的内容真的不多。

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

【问题讨论】:

  • 您可能没有使用过deQueueReusableCellWithIdentifier。在您的 cellForRowAtIndexPath 中尝试。
  • 添加到 Libra Coder 的建议,使用 dequeueReusableCellWithIdentifier: atIndexPath:
  • 我相信这两件事我都做了。我已将我的 cellForRowAtIndexPath 方法添加到主帖中。
  • 请附上项目。
  • @gabbler 附件,见主帖。

标签: ios objective-c uitableview uiviewcontroller autolayout


【解决方案1】:

从 segue 返回时,表格视图单元格似乎没有根据内容调整大小。使用示例项目,我在 viewWillAppear 中抛出了重新加载数据,这似乎解决了问题。

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

【讨论】:

    【解决方案2】:

    您的项目实际上存在几个问题。

    数据加载自动布局

    第一个是在用数据绘制单元格时导致奇怪的行为。从 segue 中展开时,您会在表格顶部看到由不明确的布局计算引起的那些额外单元格。

    解决方案:将数据移动到override func viewWillAppear(animated: Bool) { 并执行tableView.reloadData() (正如@rFessler 正确建议的那样)。 p>

    另一方面,Autolayout 是一种火热的野兽。 可驯化。值得进一步研究这个话题。我无法让您的布局与自动调整单元格高度一起使用,但我会为您留下一些参考资料和项目。


    参考资料:

    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

    【讨论】:

      【解决方案3】:

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

      我也将此添加到 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)
          }
      }
      

      现在您甚至可以旋转设备并删除行,这一切都很棒!


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

      要解决这个问题,看来我们实际上必须做一个 hack! (该死的苹果,这是怎么回事?!)

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

      目前,我认为这是最好的。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          因为tableView:estimatedHeightForRowAtIndexPath方法会在你每次切换到一个新的MVC时被调用,并改变自动布局,你可以这样做

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

          重用自动布局

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-19
            相关资源
            最近更新 更多