在我的应用程序中,我有一个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
}
}
答案 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
}
}
}