2012-06-28 9 views
10

Ho costruito tre diverse celle nello storyboard e ho agganciato tutte le prese, ogni cella ha un identificativo univoco.UITableViewCell Heights diversi?

Ad esempio, ho una cella che contiene un'immagine, un'altra che ha un'etichetta e un'altra con altri contenuti, quindi sono tutte uniche e ogni tipo di cella richiede la propria altezza (dinamica o stato, non importa) .

Tuttavia, come è possibile che una cella con "indentifier1" restituisca una certa altezza e quindi le altre celle restituiscano altezze diverse?

So che posso usare - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath ma non sono sicuro di come differenziare le celle.

Sto utilizzando i dati di base e recupero i risultati per la vista tabella da quello.

Spero che tu possa aiutare, grazie.

EDIT:

Ho provato questo con le etichette, ma i suoi crash alla prima if dichiarazione:

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

risposta

0

ovviamente si è arrestato in modo anomalo, perché si è in un metodo delegato, (si è un delegato di UITableView) e da tale metodo il richiamo dei metodi UITableView comporta un rischio molto elevato di arresto anomalo.

il metodo ([tableView cellForRowAtIndexPath:indexPath]), ciò che chiami, richiamerà nuovamente un metodo delegato per l'altezza della cella e provoca un ciclo infinito, ovvero arresto anomalo.

questo è un comportamento normale.

la chiave è nell'origine dati originale, è possibile memorizzare l'altezza per ogni riga nell'origine dati originale e si può leggere tutto da lì, nei metodi di delega senza alcun rischio.

il tuo frammento di codice non dice dove si trova l'origine dati e che tipo di origine dati è, quindi non posso dare una soluzione più esatta in mancanza di esso, ma l'idea sarebbe quella.

0

cui li differenziare esattamente come si farebbe in cellForRowAtIndexPath:. Se non lo si raggruppa per sezione, è necessario eseguire il polling dei dati per il particolare indexPath in questione e determinare successivamente l'altezza.

0

vorrei impostare il tag per ogni cella UITableView in modo che in heightForRowAtIndexPath sarete in grado di differenziare dal seguente:

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

Domanda modificata, ho provato i tag ma non sono riuscito (vedere il mio tentativo nella mia domanda). –

+0

ma come si impostano questi tag? potresti postare questo? – Apollo

+0

Ho impostato il tag nel mio storyboard, cosa sbagliata da fare? –

14

Aggiornato

Uso altezza dinamica del UITableView ora come è facile come UITableView lo calcola automaticamente

Vecchio

Utilizzare questo metodo per la vostra esigenza di seguito è un esempio:

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

Nota: Se il formato non è fisso, allora si dovrà calcolare poi fornire al precedente metodo secondo il vostro requisito.

+0

Ho dimenticato di menzionare, non so quali celle sono in quale indice, il suo contenuto utente è elencato qui. Quindi questo non funzionerebbe. –

0

Non chiamare il numero cellForRowAtIndexPath entro heightForRowAtIndexPath o si entra in un ciclo infinito che causerà l'arresto anomalo dell'app.

È necessario determinare l'altezza di ogni cella nello stesso modo in cui si determina il tipo della stessa cella in cellForRowAtIndexPath.

Questa è l'unica soluzione che penso.