2016-06-30 13 views
0

私のアプリでは、UITableViewControllerのコンテンツ(画像とテキスト全体)に応じてセルのダイナミックさが高く、セルの高さをheightForRowAtIndexPath()に計算する必要があります。これを得るには、識別子でセルをデキューする必要があります。インターフェイスビルダーで定義された制約がなく、計算が正しくないため、カスタムクラスのセルをインスタンス化することはできません。逆に、私はをheightForRowAtIndexPath()に呼び出すと、無限の再帰的ループが発生することを知っています。したがって、ここでいくつかの記事を読んで、レイWenderlichによっていくつかのチュートリアル、私はこれは(少なくともObjective-Cの中に)皆のために働くようだheightForRowAtIndexPath()Swift:dispatch_onceを使用してUITableViewCellをデキューする方法

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*/ 

にこのコードを記述することができましたが、私はなぜ知りませんそれは私のためではありません。予想どおり、無限ループでブロックされます。どうして? 私はシングルトンを使ったことは一度もなかったことを認めなければなりません。私はそれらに慣れていませんが、これは正しいと思いました。

UPDATE

私は次のことを試してみたが、それは動作しません:

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

答えて

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

のプロパティとしてそれを置くあなたの答えをありがとう、私はそれが動作しない恐れています。私はちょうどあなたの提案に従って、クラスのプロパティとして 'onceToken'と書いたコードを私の質問を更新しました...おそらく私は何かが不足しているかもしれない –

+0

多分あなたはグローバルセルを要求する必要があります。なぜならあなたは 'heightForRowAtIndexPath()'に同じ原点セルを必要とするからです。グローバルセル – ronan

+0

申し訳ありませんが、グローバルセルはどういう意味ですか?多分私はviewDidLoadの最初にそれをデキューする必要がありますか? –

関連する問題