Usando XCode 4.5 y iOS 6, estoy desarrollando una aplicación con una vista de tabla simple con celdas personalizadas. He hecho esto cientos de veces en iOS 5 y versiones anteriores, pero por alguna razón el nuevo sistema de autoLayout me está dando muchos problemas.
Configuré mi vista de tabla y celda de prototipo en IB, agregué subvistas y las conecté como IBOutlets, luego configuré mi delegado y fuente de datos. Sin embargo, ahora, cada vez que se obtiene la primera celda, aparece cellForRowAtIndexPath
el siguiente error:
*** Error de afirmación en - [ShopCell layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
*** Finalizando la aplicación debido a la excepción no detectada 'NSInternalInconsistencyException', motivo: 'El diseño automático sigue siendo necesario después de ejecutar -layoutSubviews. La implementación de ShopCell de -layoutSubviews necesita llamar a super. '
No he implementado un método -layoutSubviews en mi celda de subclases (ShopCell), e incluso cuando trato de hacer eso y agrego la super llamada, ya que sugiere que todavía obtengo el mismo error. Si elimino las subvistas de la celda en IB y las cambio a una UITableViewCell estándar, todo funciona como se esperaba, aunque, por supuesto, no tengo datos en mis celdas.
Estoy casi seguro de que me falta algo simple, pero no puedo encontrar ninguna documentación o guía que sugiera lo que hice mal. Cualquier ayuda sería apreciada.
Editar: Intenté cambiarlo a UITableViewCell en IB y dejar todas las subvistas en su lugar, sigue siendo el mismo error.
fuente
lldb [[UIWindow keyWindow] _autoLayoutTrace]
en el área del depurador si se utiliza el diseño automático.Respuestas:
Encontré el mismo problema al agregar manualmente restricciones en el código. En código, estaba haciendo lo siguiente:
Hipótesis
Por lo que puedo decir, el problema es que cuando lo deshabilita
translatesAutoresizingMaskIntoConstraints
, UITableViewCell comienza a usar Auto Layout y, naturalmente, falla porque la implementación subyacente delayoutSublayersForLayer
no llama a super. Alguien con Hopper o alguna otra herramienta puede confirmar esto. Como está utilizando IB, probablemente se esté preguntando por qué esto es un problema ... y eso se debe a que el uso de IB desactiva automáticamente lastranslatesAutoresizingMaskIntoConstraints
vistas a las que agrega restricciones (agregará automáticamente una restricción de ancho y alto en su lugar).Solución
Mi solución fue trasladar todo al
contentView
.No estoy 100% seguro de si esto funcionará en Interface Builder, pero si empuja todo fuera de su celular (asumiendo que tiene algo directamente en él) entonces debería funcionar. ¡Espero que esto te ayude!
fuente
subview.translatesAutoresizingMaskIntoConstraints = NO'
en cada subvista que estaba agregando a contentView.self.contentView.translatesAutoresizingMaskIntoConstraints = NO
alUITableViewCell
.Aparentemente, la implementación de layoutSubviews de UITableViewCell no llama a super, lo cual es un problema con el diseño automático. Me interesaría ver si colocar la siguiente categoría en proyectos soluciona las cosas. Ayudó en un proyecto de prueba.
Podría agregar el problema que se me mostró al usar una vista de fondo en la celda de la tabla, ya que se agrega como una subvista a la celda (mientras que la mayoría de las subvistas deben agregarse a la vista de contenido de la celda de la tabla, que generalmente debería funcionar mejor).
Nota: Parece que este error se corrigió en iOS7; Pude eliminar este código, o al menos agregar una verificación de tiempo de ejecución para que solo se realice si se ejecuta en iOS6.
fuente
UITableView
por la misma razón (iOS 6.1 b1)Tuve el mismo error durante unos meses. Pero encontré cuál era el problema.
Cuando creo un archivo IB,
UIView
ya está agregado. Si usa esta vista, la aplicación no se bloquea cuando el diseño automático está deshabilitado (pero hay otros problemas). Cuando se usa la disposición de auto, usted tiene que seleccionar el correcto punto de vista en la biblioteca de objetos:UITableViewCell
.De hecho, usted debe siempre utilizar este elemento porque todos subvistas se añaden a la
contentView
de laUITableViewCell
.Eso es todo. Todo estará bien.
fuente
Tuve el mismo problema con custom
UITableViewHeaderFooterView
+ xib.Vi algunas respuestas aquí, pero encontré qué implementación
-layoutSubviews
en mi clase de vista de pie de página personalizada soluciona el problema:fuente
Veía esto como resultado de la modificación de restricciones en mi implementación de layoutSubviews. Mover la llamada a super desde el principio hasta el final del método solucionó el problema.
fuente
Tuve el mismo problema en iOS 7 (iOS 8 parece solucionarse). La solución para mí fue llamar
[self.view layoutIfNeeded]
al final de miviewDidLayoutSubviews
método.fuente
Tuve el mismo problema. El problema estaba en la forma en que estaba creando la celda Xib. Creé un Xib como de costumbre y simplemente cambié el tipo de "UIView" predeterminado a mi clase personalizada UITableViewCell. La forma correcta de hacerlo es eliminar primero la vista predeterminada y luego arrastrar el objeto de la celda de la vista de tabla al xib. Más detalles aquí: http://allplayers.github.io/blog/2012/11/18/Custom-UITableViewCell-With-NIB/
fuente
Resolví el problema desactivando "Diseño automático" para todas las subvistas de mi celda de vista de tabla personalizada.
En el xib de una celda personalizada, seleccione una subvista y desmarque el Inspector de archivos> Documento de Interface Builder> Usar diseño automático
fuente
Tuve un problema similar no
UITableViewCell
enUITableView
sí mismo sino en sí mismo. Porque es el primer resultado en Google, lo publicaré aquí. Resultó que eseviewForHeaderInSection
era el problema. CreéUITableViewHeaderFooterView
y configurétranslatesAutoresizingMaskIntoConstraints
enNO
. Ahora aquí viene la parte interesante:ios 7:
Si hago esto, la aplicación se bloquea con
De acuerdo, pensé que no se puede usar el diseño automático en un encabezado de vista de tabla y solo en las subvistas. Pero esa no es toda la verdad como la verá más adelante. En resumen: no desactive la máscara de cambio de tamaño automático para el encabezado en iOS 7. De lo contrario, está funcionando bien.
iOS 8:
Si no usara esto, obtendría el siguiente resultado:
Para iOS 8, debe deshabilitar la máscara de cambio de tamaño automático para el encabezado.
No sé por qué se comporta de esta manera, pero parece que Apple solucionó algunas cosas en iOS 8 y el diseño automático funciona de manera diferente en iOS 7 e iOS 8.
fuente
Como ya ha dicho alguien anteriormente, cuando crea una vista para usar en un UITableView, debe eliminar la vista creada por defecto y arrastrar un UITableViewCell o UITableViewHeaderFooterView como la vista raíz. Sin embargo, hay una forma de arreglar el XIB en caso de que se haya perdido esa parte. Debe abrir el archivo XIB en un editor de texto y en la etiqueta raíz y su hijo directo agregar / cambiar el atributo
translatesAutoresizingMaskIntoConstraints
aYES
, por ejemplo<view contentMode="scaleToFill" horizontalHuggingPriority="1000" id="1" translatesAutoresizingMaskIntoConstraints="YES" customClass="MXWCollapsibleTableHeaderView">
fuente
Me encuentro con esto y parece que está relacionado con las subclases de UITableViewCell como celdas prototipo que específicamente tienen otras subclases de UIView personalizadas agregadas. Hago hincapié en la 'costumbre' aquí porque he tenido éxito con celdas que solo tienen hijos UIKit, pero se cae al tratar de construir las restricciones para las vistas que he creado a medida, arrojando el error indicado en la pregunta del autor.
Tuve que separar mis celdas en plumillas independientes que no usan AutoLayout.
Esperemos que Apple limpie este lío.
fuente
Agregue sus subvistas al contentView de la celda en lugar de la celda en sí. Entonces en lugar de:
[self addSubview:someView];
debes usar
[self.contentView addSubview:someView];
fuente
Encontré este porque inicialmente había agregado un UIView en lugar de un UITableViewCell a un archivo xib.
fuente
Eliminé este error desacoplando el
backgroundView
conector de mi fondoUIImageView
y elaccessoryView
conector de misUIButton
personalizaciones. Sospecho que estos no estaban destinados a ser usados de la forma en que los estaba usando.fuente
Hoy me había encontrado con este problema por primera vez. Hasta ahora, tenía varias experiencias en el uso de subclases prototipo UITableViewCell, pero nunca encontré este problema. Lo diferente de la celda con la que estaba trabajando era que tenía un IBOutlet para -backgroundView que estaba usando para colorear la celda. Descubrí que si creaba una nueva propiedad y aún agregaba una UIView nueva que extendía el lapso de toda la celda, esta afirmación desaparecía. Para verificar que esta era la causa, volví a adjuntar esta vista a la salida backgroundView y reapareció la afirmación. Hasta ahora, no hay otros problemas al usar AutoLayout en un prototipo de subclase UITableViewCell desde que hice este cambio.
fuente
No obtuve ninguna solución adecuada para este problema, pero puede solucionarlo usando marcos y no configurando la propiedad translatesAutoresizingMaskIntoConstraints en No (de forma predeterminada es sí, así que no lo configure)
fuente
Yo he estado experimentando lo mismo. Resultó que si agrega programáticamente una subvista desde su ShopCell .xib / storyboard, que usa el diseño automático, como una subvista a otra vista, esa excepción podría lanzarse, dependiendo de cómo estén configuradas sus restricciones. Supongo que las restricciones creadas en IB son las que crean los problemas al agregar programáticamente una vista como una subvista, ya que luego mantiene las restricciones de viewA -> viewB mientras tanto, puede agregar viewB como una subvista de viewC. ¿Lo entendiste (esa frase incluso me confunde)?
En mi situación, dado que fueron vistas muy simples las que causaron el problema, creé las vistas programáticamente y no en IB. Eso lo resolvió. Puede extraer esas vistas a otros archivos xib y deshabilitar el diseño automático para esos. Supongo que funcionaría.
fuente
En algunas situaciones, esto resuelve el problema de diseño fácilmente (dependiendo de su diseño). Dentro de su subclase UITableView, en awakeFromNib o init, configure la máscara de autoresizing:
Por defecto, se establece en UIViewAutoresizingNone
fuente
[tableViewCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
para obtener la altura, que luego usoheightForRowAtIndexPath
.En mi caso,
El UIImageView al que se hace referencia para el diseño automático de UITableView se asigna a backgroundView de UITableView.
Entonces, eliminé UIImageView para backgroundView de UIView (vista raíz) y restablecí (eliminé) todas las referencias de diseño automático a ese UIImageView. Coloqué ese UIImageView para el fondo en el exterior de UIView (vista raíz). Y luego asigne al backgroundView de UITableView en el código.
Luego arreglado.
fuente
He encontrado la solución.
En mi caso, creé la vista de la celda en el guión gráfico (con el diseño automático habilitado) y definí la interfaz personalizada UITableViewCell en mi ViewController.m, tengo que mover la interfaz a ViewController.h.
fuente
Encontré el mismo problema cuando uso el guión gráfico para crear el UITableViewCell personalizado. Afortunadamente encontré el problema, porque saqué el accesorio de vista ([UITableViewCell setAccessoryView:]) a UIButton que agregué a la celda.
Solución
Propuesta
fuente
Este problema puede deberse a olvidar llamar desde
[super viewDidAppear:]
dentroviewDidAppear
, pero estoy seguro de que no es la única causa.fuente
Tuve exactamente el mismo problema. Aquí está el problema con mi proyecto:
cuando trabajé en Interface Builder para crear una UITableViewCell personalizada, arrastré una Vista en lugar de una Celda de Vista de Tabla desde el panel de colección de objetos en Xcode
como celda de tabla personalizada.
Si se encuentra en la misma situación, esta es la solución:
elimine la vista en el generador de interfaces, asegúrese de arrastrar una celda de vista de tabla desde el panel de colección de objetos y rehaga la vista de celda de tabla personalizada. Puede copiar los objetos en la vista anterior y pegarlos en el lienzo de la nueva celda de vista de tabla.
fuente
Tuve un problema muy similar con una vista de pie de tabla que estaba configurando en Xcode 6, iOS 7+. La solución estaba en el formato del archivo nib. Aparentemente estaba atascado en formato Xcode 4 o algo así. Cambiar la configuración del archivo a "abre en: Xcode 6.0" (o predeterminado, para el caso), lo solucionó instantáneamente. Encontré la solución por casualidad: me estaba volviendo loco, así que eliminé todo el archivo y lo volví a crear, obviamente con la configuración predeterminada. No tengo idea de por qué simplemente editar el archivo en el último Xcode no lo convirtió a un formato Xcode 5+, como suele suceder.
fuente
Fui y tuve el mismo problema. Fui a mi DetailViewController y cambié el nombre del identificador a UIView. Anteriormente estaba en UITableView. Solucionó el problema. Este problema no tiene que estar en su DetailViewController. Podría estar en cualquier otro. Intente cambiarle el nombre al identificador respetado.
fuente
Tuve un problema similar con las celdas de vista de tabla estática en IB. Una de las celdas tenía una subvista que tenía una clase que se modificó por error a una subclase de UITextfield. El compilador no dio ninguna advertencia / error. Pero en tiempo de ejecución, el sistema no pudo cargar el controlador de vista con el bloqueo mencionado anteriormente como resultado.
fuente
El problema es la secuenciación de las llamadas de diseño a las subvistas:
Revisa
Aparece en iOS <8
fuente
Solución: cambie las restricciones antes de llamar al súper diseño
fuente
He modificado la respuesta de Carl Lindberg para anular
UITableView
su lugar y comenzó a trabajar para mí:UITableView + AutoLayoutFix.h
UITableView + AutoLayoutFix.m
Luego
MyViewController.m
, acabo de importar la categoría:fuente
Encontré el mismo problema y finalmente descubrí que la razón fue que agregué una restricción a UITableViewCell, que debería ser el contentView de UITableViewCell . Cuando cambié la restricción, ¡todo salió bien!
fuente