2016-06-30 2 views
0

In meiner App habe ich eine UITableViewController deren Zellen sind sehr dynamisch nach ihrem Inhalt (Gesamtbilder und Text) und ich muss die Höhe für eine Zelle in heightForRowAtIndexPath() berechnen. Um das zu bekommen, muss ich eine Zelle nach Identifier aus der Warteschlange nehmen. Ich kann eine Zelle ihrer benutzerdefinierten Klasse nicht einfach instanziieren, da die in Interface Builder definierten Einschränkungen fehlen würden und der Kalkül nicht richtig wäre. Im Gegenteil, ich weiß, dass das Aufrufen von dequeueReusableCellWithIdentifier() in heightForRowAtIndexPath() eine unendliche rekursive Schleife verursacht. So einige Beiträge hier zu lesen und einige Tutorials von Ray Wenderlich, konnte ich diesen Code schreiben, in heightForRowAtIndexPath()Swift: Wie verwendet man dispatch_once, um eine UITableViewCell aus der Warteschlange zu nehmen?

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

Diese für alle zu funktionieren scheint (zumindest in Objective-C), aber ich weiß nicht, warum es ist nicht für mich. Wie erwartet blockiert es in einer Endlosschleife. Warum? Ich muss zugeben, dass ich Singleton nie benutzt habe und ich ihnen nicht vertraut bin, aber ich dachte, das wäre richtig. Irgendeine Idee?

UPDATE

Ich habe versucht, nur die folgenden, aber es funktioniert nicht:

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

Antwort

2

var onceToken = dispatch_once_t() außerhalb der Methode deklarieren.

legte es als eine Eigenschaft Ihres Viewcontroller

class ViewController: UITableViewController { 

    var onceToken = dispatch_once_t() 

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

Dank für Ihre Antwort danken, aber ich habe Angst, es nicht funktioniert. Ich habe gerade meine Frage aktualisiert, welche der Code, den ich nach Ihren Vorschlägen geschrieben habe, mit 'onceToken' als Eigenschaft der Klasse ... vielleicht fehlt mir etwas –

+0

vielleicht sollten Sie eine globale Zelle beanspruchen. weil Sie die gleiche Ursprungszelle in 'heightForRowAtIndexPath()' benötigen. globale Zelle würde funktionieren – ronan

+0

Entschuldigung, was meinst du für globale Zelle? vielleicht die Tatsache, dass ich es am Anfang in ViewDidLoad herausnehmen sollte? –

Verwandte Themen