Swift:如何使用dispatch_once将UITableViewCell出列?

时间:2016-06-30 07:02:15

标签: ios objective-c swift uitableview singleton

在我的应用程序中,我有一个UITableViewController,其单元格根据其内容(整体图像和文本)非常动态,我需要计算heightForRowAtIndexPath()中单元格的高度。为了得到这个,我需要通过标识符将单元格出列。我不能简单地实例化其自定义类的单元格,因为它缺少界面构建器中定义的约束,并且微积分是不对的。相反,我知道在dequeueReusableCellWithIdentifier()中调用heightForRowAtIndexPath()将导致无限递归循环。因此,阅读Ray Wenderlich的一些帖子和一些教程,我能够在heightForRowAtIndexPath()

中编写这段代码。
var token: dispatch_once_t = 0
var cell = nil
dispatch_once(&token) {
  cell =  tableView.dequeueReusableCellWithIdentifier("BigTextCell", forIndexPath: indexPath) as! BigTextCell
}
/*adjust cell constraints and return its height*/

这似乎适用于所有人(至少在Objective-C中),但我不知道为什么它不适合我。正如预期的那样,它会在无限循环中阻塞。为什么? 我必须承认,我从来没有使用过单身,而我对他们并不熟悉,但我认为这是对的。 有什么想法吗?

更新

我刚刚尝试过以下操作,但它不起作用:

  var cell:BigTextCell!
  dispatch_once(&onceToken) {
    cell =  tableView.dequeueReusableCellWithIdentifier("BigTextCell", forIndexPath: indexPath) as! BigTextCell
  }
  for constraint in cell.paragraph.constraints {
    if (constraint.identifier == "longTextConstraint") {
      constraint.constant = cell.paragraph.sizeThatFits(CGSize(width: cell.paragraph.frame.width, height: CGFloat.max)).height
      return constraint.constant
    }
  }

1 个答案:

答案 0 :(得分:2)

在方法之外声明var onceToken = dispatch_once_t()

将其作为ViewController的属性

class ViewController: UITableViewController {

    var onceToken = dispatch_once_t()

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath:  NSIndexPath) -> CGFloat {
        dispatch_once(&onceToken) {
            //your code
        }
    }
}