2012-06-28 8 views
10

Ich habe drei verschiedene Zellen in meinem Storyboard aufgebaut und alle Ausgänge angeschlossen, jede Zelle hat eine eindeutige Kennung.Verschiedene UITableViewCell Heights?

Zum Beispiel habe ich eine Zelle, die ein Bild enthält, eine andere, die eine Beschriftung und eine andere mit anderen Inhalten, so dass sie alle einzigartig sind und jeder Zelltyp seine eigene Höhe benötigt (dynamisch oder Status, spielt keine Rolle) .

Wie aber kann ich eine Zelle mit 'indentfier1' eine bestimmte Höhe zurückgeben und dann die anderen Zellen unterschiedliche Höhen zurückgibt?

Ich weiß, ich kann - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath verwenden, aber ich bin mir nicht sicher, wie man die Zellen unterscheidet.

Ich verwende Kerndaten und holen Ergebnisse für die Tabellenansicht von diesem.

Ich hoffe, Sie können helfen, danke.

EDIT:

Ich habe versucht, diese mit Tags, aber seine Abstürze an der ersten if Aussage:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat cellHeight; 

    if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 1) cellHeight = 170; 
    else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 2) cellHeight = 100; 
    else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 3) cellHeight = 140; 

    return cellHeight; 
} 

Antwort

0

natürlich abgestürzt, weil Sie in einer Delegate-Methode sind (Sie sind ein Delegierter der UITableView) und von einer solchen Methode zurückrufen die UITableView Methoden dauert sehr hohes Risiko des Absturzes.

die Methode ([tableView cellForRowAtIndexPath:indexPath]), was Sie aufrufen, wird eine Delegate-Methode erneut für die Höhe der Zelle aufrufen, und es verursacht eine Endlosschleife, auch Absturz genannt.

Dies ist normales Verhalten.

Der Schlüssel ist in Ihrer ursprünglichen Datenquelle, Sie könnten die Höhe für jede Zeile in der ursprünglichen Datenquelle speichern, und Sie können alles von dort, in Ihren Delegiertenmethoden ohne Risiko lesen.

Ihr Code-Fragment sagt nicht, wo Ihre Datenquelle ist und welche Art Ihrer Datenquelle ist, daher kann ich keine genauere Lösung in Ermangelung geben, aber die Idee wäre das.

0

Sie sie genau unterscheiden würde, wie man es in cellForRowAtIndexPath:. Wenn Sie sie nicht nach Abschnitt gruppieren, müssen Sie Ihre Daten für den betreffenden bestimmten indexPath abfragen und die Höhe danach bestimmen.

0

Ich würde den Tag für jede UITableView Zelle so eingestellt, dass in heightForRowAtIndexPath werden Sie von den folgenden unterscheiden können:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
if ([self.tableview cellForRowAtIndexPath:indexPath].tag == yourTag){ 
    //perform your action for cell 1, 2, or 3 
    } 
else if (etc...) 
} 
+0

Bearbeitete Frage, ich habe versucht Tags, aber fehlgeschlagen (siehe mein Versuch in meiner Frage). –

+0

richtig, aber wie stellen Sie diese Tags ein? Könntest du das posten? – Apollo

+0

Ich habe das Tag in meinem Storyboard gesetzt, falsche Sache zu tun? –

14

Aktualisiert

Verwenden dynamische Höhe von UITableView jetzt als Es ist einfach, da UITableView es automatisch berechnet

Alt

Verwenden Sie diese Methode, um Ihre Anforderung unten ist ein Beispiel:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    //calculate height according to text and on basis of indexPath 
    if(indexpath.row == 0) 
    { 
    return 60.0f; 
    } 
    else if(indexpath.row == 1) 
    { 
    return 70.0f; 
    } 
    else 
    { 
    return 55.0f; 
    } 
} 

Hinweis: Wenn Ihre Größe nicht dann fixiert werden Sie berechnen dann in obigen Verfahren entsprechend Ihrer Anforderung.

+0

Ich habe vergessen zu erwähnen, ich weiß nicht, welche Zellen bei welchem ​​Index sind, sein Benutzerinhalt ist hier aufgelistet. Das würde also nicht funktionieren. –

0

Sie sollten nicht cellForRowAtIndexPath innerhalb heightForRowAtIndexPath aufrufen oder Sie werden eine Endlosschleife eingeben, die zum Absturz der App führen wird.

Sie sollten die Höhe jeder Zelle auf dieselbe Weise bestimmen, wie Sie den Typ der gleichen Zelle in cellForRowAtIndexPath bestimmen.

Das ist die einzige Lösung, denke ich.