UITableViewCell detailTextLabel desaparece al desplazarse

Estoy usando una serie de cadenas donde puse detailTextLabel . Inicialmente, todos los subtítulos están configurados correctamente, pero si detailTextLabel desaparecerá.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"personCell" forIndexPath:indexPath]; Person *person = [_persons objectAtIndex:indexPath.row]; cell.textLabel.text = person.name; cell.detailTextLabel.text = person.phone; // also tried setNeedsLayout but does not help [cell setNeedsLayout]; return cell; } 

Estoy usando un iPhone 6 y iOS 8. También estoy usando storyboard y establezco el estilo UITableViewCell en Subtitle .

Bien, ahora que hemos encontrado el problema (con el text del número de teléfono nulo en la persona), podrías resolverlo de varias maneras.

Parece que no desea establecer el text en blanco. Me imagino que esto se debe al hecho de que expone la celda de una manera extraña con el título subido a la parte superior, pero nada debajo. Comprensible.

Entonces, podrías crear una subclass UITableViewCell personalizada. En él, usted puede gestionar el layout usted mismo y si el número es nulo, expóngalo de una manera y si tiene un número de teléfono, colóquelo de una manera diferente.

Una forma más fácil sería usar dos células prototipo diferentes en su lugar.

En el guión gráfico, crea dos celdas prototipo.

Uno con tipo Basic y darle un reuseIdentifier noPhoneNumberCell . El otro con tipo Subtitle y un identificador de reutilización phoneNumberCell .

Luego en el código puedes hacer algo como esto …

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Person *person = [_persons objectAtIndex:indexPath.row]; UITableViewCell *cell; if (person.phone) { cell = [tableView dequeueReusableCellWithIdentifier:@"phoneNumberCell" forIndexPath:indexPath]; cell.detailTextLabel.text = person.phone; } else { cell = [tableView dequeueReusableCellWithIdentifier:@"noPhoneNumberCell" forIndexPath:indexPath]; } cell.textLabel.text = person.name; return cell; } 

Esto ahora creará dos queues de celdas. Uno para personas con numbers de teléfono y uno para personas sin.

De esta forma, no mezclarás los dos y así evitarás el problema que enfrentas.

 [cell.detailTextLabel sizeToFit]; 
 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; }