2012-06-28 16 views
10

He creado tres celdas diferentes en mi guión gráfico y enganché todas las salidas, cada celda tiene un identificador único.Distintas alturas UITableViewCell?

Por ejemplo, tengo una celda que contiene una imagen, otra que tiene una etiqueta y otra con otros contenidos, por lo que son únicas y cada tipo de celda requiere su propia altura (dinámica o estado, no importa) .

Sin embargo, ¿cómo es que puedo hacer que una celda con 'indentifier1' regrese a cierta altura y luego las otras células devuelven diferentes alturas?

Sé que puedo usar - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath pero no estoy seguro de cómo diferenciar las celdas.

Estoy utilizando datos básicos y obtengo resultados para la tabla vista de eso.

Espero que puedas ayudar, gracias.

EDIT:

he intentado esto con etiquetas, pero sus choques en la primera if declaración:

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

Respuesta

0

por supuesto que se bloqueó, porque está en un método de delegado, (usted es un delegado del UITableView) y de ese método devolver los métodos UITableView tiene un alto riesgo de bloqueo.

el método ([tableView cellForRowAtIndexPath:indexPath]), como llame, llamará a un método delegado de nuevo para la altura de la celda, y provoca un bucle infinito, también conocido como bloqueo.

esto es comportamiento normal.

la clave está en su origen de datos original, puede almacenar la altura de cada fila en el origen de datos original, y puede leer todo desde allí, en sus métodos delegados, sin ningún riesgo.

su fragmento de código no dice dónde está su fuente de datos y qué tipo de fuente de datos es, por lo que no puedo dar una solución más exacta en su defecto, pero la idea sería esa.

0

Se podría diferenciarlos exactamente como lo haría en cellForRowAtIndexPath:. Si no los está agrupando por sección, entonces tendría que sondear sus datos para el índice en cuestión y determinar la altura después de eso.

0

Me puse la etiqueta para cada celda UITableView para que en heightForRowAtIndexPath podrás diferenciar por lo siguiente:

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

Pregunta editada, he intentado con las etiquetas pero he fallado (vea mi intento en mi pregunta). –

+0

correcto, pero ¿cómo estás configurando estas etiquetas? ¿podrías publicar eso? – Apollo

+0

He establecido la etiqueta en mi guión gráfico, ¿qué hay de malo en hacer? –

14

Actualizado

Uso altura dinámica de UITableView ahora como es fácil ya que UITableView lo calcula automáticamente

Antiguo

Utilice este método para su requerimiento a continuación es un ejemplo:

- (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: si el tamaño no es fija, entonces tendrá que calcular a continuación proporcionan en el anterior método de acuerdo a sus necesidades.

+0

Olvidé mencionar, no sé qué celdas están en qué índice, su contenido de usuario se detalla aquí. Entonces esto no funcionaría –

0

No debe llamar al cellForRowAtIndexPath dentro de heightForRowAtIndexPath o ingresará un bucle infinito que causará la falla de la aplicación.

Debe determinar la altura de cada celda de la misma manera que determina el tipo de la misma celda en cellForRowAtIndexPath.

Esa es la única solución, creo.