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
}
}
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 –
vielleicht sollten Sie eine globale Zelle beanspruchen. weil Sie die gleiche Ursprungszelle in 'heightForRowAtIndexPath()' benötigen. globale Zelle würde funktionieren – ronan
Entschuldigung, was meinst du für globale Zelle? vielleicht die Tatsache, dass ich es am Anfang in ViewDidLoad herausnehmen sollte? –