framework for development desarrollador cuenta app ios ios8 xcode6

for - swift ios documentation



Subtítulos de UITableViewCell no se actualizará (6)

Como trabajo temporal, simplemente introduje un espacio en blanco en la etiqueta de texto y, programáticamente, donde establezco el texto de la etiqueta en cero, lo configuro en un espacio en blanco

cell.detailTextLabel.text = @" ";

Ajuste su lógica en consecuencia para tratar con un espacio en blanco solitario como nulo.

Para mí, la etiqueta de texto del detalle no apareció aunque tenía una cadena lista para ella antes de cargar el controlador de visualización. una de mis muchas celdas muestra la fecha actual en una etiqueta de texto de detalle como predeterminada siempre que aparece el controlador de vista, pero tampoco funcionó.

Creo que esto tiene algo que ver con el hecho de que iOS 8 no puede actualizar el texto de la etiqueta de texto si se establece en cero inicialmente.

Así que asegúrese de introducir también un espacio en blanco en su prototipo de celda, en el constructor de interfaz. Sorprendentemente, el texto en las etiquetas de mis celdas personalizadas funciona bien.

Hoy comencé a preparar mis aplicaciones para iOS8. Descubrí que los subtítulos de mi UITableCells no se actualizarán en viewWillAppear . Lo reduje a un ejemplo mínimo:

Tengo una celda estática TableViewController con 2 celdas (estilo = subtítulo) Un subtítulo está vacío y el otro está configurado.

Actualizo los subtítulos de esta manera:

- (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[self.without detailTextLabel] setText:@"foobar"]; [[self.with detailTextLabel] setText:@"barfoo"]; }

Si bien todo funciona bajo iOS7 (y 6 y 5), iOS8 no actualizará el título de la primera celda.

Sin embargo, cuando toco la celda, se actualizará y mostrará el texto.

¿Es esto un problema de simulador? ¿Un insecto? ¿Estoy haciendo algo mal?


Confirmado. iOS8 no está dibujando detailText si se inicializa a nil. Esta simple línea debería hacer el truco.

self.detailTextLabel.attributedText = [[NSAttributedString alloc] initWithString:@" "];


He visto dos causas de este problema en iOS8.

  1. Si configura el texto en la etiqueta de detalles como nulo o "" (los lugares más frecuentes donde se hace esto es en prepareForReuse y / o eliminando el texto predeterminado del guión gráfico) [Como se indicó en las respuestas anteriores, este problema se resuelve en iOS9]

  2. Si subclase una UITableViewCell de tipo subtítulo y luego registra la celda que creó en el guión gráfico mediante programación. [Este es un error de programación, no es necesario registrar las células prototipo creadas en el guión gráfico]


Parece que Apple agregó una optimización que elimina la etiqueta detailTextLabel de la jerarquía de vista cuando el valor es nulo, y vuelve a agregar según sea necesario. Lamentablemente, en mis pruebas, se agrega durante un pase de diseño, pero solo después de que hubiera cambiado de tamaño para ajustarse al nuevo texto con ese pase de diseño, por lo que el tamaño sigue siendo cero. El siguiente pase de diseño (por ejemplo, en una rotación) mostrará OK.

Una solución alternativa puede ser volver a agregar la etiqueta a la jerarquía de vista en todas las circunstancias (parece que debería estar bien si es de tamaño cero). Me interesaría ver si eliminar la categoría de abajo en tu aplicación corrige las cosas.

#import <objc/runtime.h> /* * In iOS8 GM (and beta5, unsure about earlier), detail-type UITableViewCells (the * ones which have a detailTextLabel) will remove that label from the view hierarchy if the * text value is nil. It will get re-added during the cell''s layoutSubviews method, but... * this happens just too late for the label itself to get laid out, and its size remains * zero. When a subsequent layout call happens (e.g. a rotate, or scrolling the cells offscreen * and back) then things get fixed back up. However the initial display has completely blank * values. To fix this, we forcibly re-add it as a subview in both awakeFromNib and prepareForReuse. * Both places are necessary; one if the xib/storyboard has a nil value to begin with, and * the other if code explicitly sets it to nil during one layout cycle then sets it back). * Bug filed with Apple; Radar 18344249 . * * This worked fine in iOS7. */ @implementation UITableViewCell (IOS8DetailCellFix) + (void)load { if ([UIDevice currentDevice].systemVersion.intValue >= 8) { /* Swizzle the prepareForReuse method */ Method original = class_getInstanceMethod(self, @selector(prepareForReuse)); Method replace = class_getInstanceMethod(self, @selector(_detailfix_prepareForReuse)); method_exchangeImplementations(original, replace); /* * Insert an awakeFromNib implementation which calls super. If that fails, then * UITableViewCell already has an implementation, and we need to swizzle it instead. * In IOS8 GM UITableViewCell does not implement the method, but they could add one * in later releases so be defensive. */ Method fixawake = class_getInstanceMethod(self, @selector(_detailfix_super_awakeFromNib)); if (!class_addMethod(self, @selector(awakeFromNib), method_getImplementation(fixawake), method_getTypeEncoding(fixawake))) { original = class_getInstanceMethod(self, @selector(_detailfix_awakeFromNib)); replace = class_getInstanceMethod(self, @selector(awakeFromNib)); method_exchangeImplementations(original, replace); } } } - (void)__detailfix_addDetailAsSubviewIfNeeded { /* * UITableViewCell seems to return nil if the cell style does not have a detail. * If it returns non-nil, force add it as a contentView subview so that it gets * view layout processing at the right times. */ UILabel *detailLabel = self.detailTextLabel; if (detailLabel != nil && detailLabel.superview == nil) { [self.contentView addSubview:detailLabel]; } } - (void)_detailfix_super_awakeFromNib { [super awakeFromNib]; [self __detailfix_addDetailAsSubviewIfNeeded]; } - (void)_detailfix_awakeFromNib { [self _detailfix_awakeFromNib]; [self __detailfix_addDetailAsSubviewIfNeeded]; } - (void)_detailfix_prepareForReuse { [self _detailfix_prepareForReuse]; [self __detailfix_addDetailAsSubviewIfNeeded]; } @end

Puede haber otros enfoques: si puede llamar a setNeedsLayout en el momento adecuado, puede forzar un pase de diseño adicional que corrige las cosas, pero no pude encontrar el momento adecuado para eso.

EDITAR: Un comentario a continuación indica que las celdas re-mostradas podrían ser un problema. Por lo tanto, una solución más simple puede ser simplemente echar un vistazo a las presentaciones de diseño y hacer el control antes de llamar a la implementación de Apple. Eso podría resolver todos los problemas, ya que es durante la llamada de diseño que ocurre el problema. Entonces, debajo está esa versión de la solución: me interesaría ver si funciona.

#import <objc/runtime.h> @implementation UITableViewCell (IOS8DetailCellFix) + (void)load { if ([UIDevice currentDevice].systemVersion.intValue >= 8) { Method original = class_getInstanceMethod(self, @selector(layoutSubviews)); Method replace = class_getInstanceMethod(self, @selector(_detailfix_layoutSubviews)); method_exchangeImplementations(original, replace); } } - (void)_detailfix_layoutSubviews { /* * UITableViewCell seems to return nil if the cell type does not have a detail. * If it returns non-nil, force add it as a contentView subview so that it gets * view layout processing at the right times. */ UILabel *detailLabel = self.detailTextLabel; if (detailLabel != nil && detailLabel.superview == nil) { [self.contentView addSubview:detailLabel]; } [self _detailfix_layoutSubviews]; } @end

EDITAR: Parece que este error está solucionado en iOS9. Entonces, la condición se puede cambiar a:

if ([UIDevice currentDevice].systemVersion.intValue == 8)

Si una aplicación solo necesita compatibilidad con iOS9 y superior, la categoría de corrección de swizzle solo se puede eliminar.


Pasaron unos días y creo que tendré que usar una solución alternativa:

- (void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.without setNeedsLayout]; }

Esto tiene un retraso visible, pero es la única forma que pude encontrar para que el texto aparezca y sea legible en iOS8.


Tengo el mismo problema, en cellForRowAtIndexPath cell.layoutSubviews() antes de devolver la celda. Resuelve el problema.