¿Por qué estoy recibiendo un "Diseño automático que aún se requiere después de ejecutar el error" playoutSubviews "cada vez que se inicia mi aplicación?

Desde que agregué el siguiente código, cada vez que mi aplicación abre este UITableViewController se bloquea:

  self.noArticlesView = [[UIView alloc] init]; self.noArticlesView.translatesAutoresizingMaskIntoConstraints = NO; self.noArticlesView.backgroundColor = [UIColor colorWithRed:0.961 green:0.961 blue:0.961 alpha:1]; [self.view addSubview:self.noArticlesView]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.noArticlesView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.noArticlesView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.noArticlesView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.noArticlesView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]]; 

Y me da este error:

* Finalización de la aplicación debido a la exception no detectada 'NSInternalInconsistencyException', razón: 'El layout automático sigue siendo necesario después de ejecutar -layoutSubviews. La implementación de UITableView de -layoutSubviews necesita llamar super. '

¿Qué diablos estoy haciendo mal? Llamo a ese código en tableView:numberOfRowsInSection: cuando hay 0 filas.

Estaba subclassando UIScrollView y recibí el mismo post de error en iOS 7 (pero no 8).

Estuve reemplazando layoutSubviews de una manera similar a la siguiente:

 - (void)layoutSubviews { [super layoutSubviews]; // code to scroll the view } 

Resolví el problema moviendo la llamada al layout del SuperSubview para que sea lo último en el método:

 - (void)layoutSubviews { // code to scroll the view [super layoutSubviews]; } 

Tuvo el mismo problema. Vista (s) agregada (s) a self.tableView y restricciones usadas. No agregue las vistas a la vista de la tabla a través de addSubview: pero agréguelas como encabezado (s), pie de página (s) o celdas.

[auto.view layoutIfNeeded]

Espero que esto ayude

También debe deshabilitar la traducción de máscara para la vista de tabla.

para mi fue esto

 self.tableView.backgroundView = self.emptyView; 

Me cambié a esto

  NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"8.0" options: NSNumericSearch]; if (order == NSOrdenetworkingSame || order == NSOrdenetworkingDescending) { // OS version >= 8.0 self.tableView.backgroundView = self.emptyView; }else{ [self.tableView.backgroundView addSubview:self.emptyView]; } 

Checkout "El layout automático sigue siendo necesario después de ejecutar -layoutSubviews" con la subclass UITableViewCell ya que la pregunta parece ser la misma.

Pude implementar la categoría mencionada en una de las respuestas que resolvió el problema para mí. Sin embargo, tuve que crear la categoría en la class UITableView lugar de la class UITableViewCell como se discute en esa respuesta particular.

Puede agregar su "vista sin artículos" como un encabezado personalizado en la tabla para asegurarse de que esté colocado correctamente.

Una posible solución no es agregar el noArticlesView directamente en la tabla, sino poner el UITableView dentro de una UIView contenedor (eventualmente establecer las restricciones de la tabla para que encaje con el marco contenedor) y luego restringir su noArticlesView al contenedor, usando las mismas restricciones que usted establezca y en el mismo lugar en su código, que se encuentra dentro del -tableView:numberOfRowsInSection: UITableViewDataSource . Lo probé con un simple ejemplo, y funcionó.
Los cambios que debe aplicar a su código son replace el UITableViewController por un UIViewController, agregar una vista de contenedor (a less que desee que su tabla se ajuste exactamente a la vista del controller de vista, en tal caso esta vista es el contenedor) y luego restringir su noArticleVer en el contenedor en lugar de la tabla. Mi código de ejemplo está al final de esta respuesta.
Trataré de hacer una posible explicación del motivo del problema y por qué funciona esta solución, pero considero que parte de mi explicación se basa en las conjeturas, por lo que no podría ser completamente exacta.
En primer lugar, una breve explicación de cómo funciona el process de representación de la jerarquía de vista en iOS. El primer paso para el motor de layout es determinar el tamaño y la position de todas las vistas y sub-vistas en la jerarquía de vistas. Por lo general, esto se hace con un enfoque iterativo, en el que se evalúan las restricciones de layout automático, para determinar el tamaño y la position de las vistas y subprocesss, y luego se -layoutSubviews método de reproducción de las vistas para ajustar: esto significa que puede cambiar su layout después Las restricciones se evalúan. Lo que requiere el motor de layout es que si el método -layoutSubviews cambia las restricciones de nuevo, entonces- -[super layoutSubviews] debe volver a llamarse para permitir el process iterativo: si esto no sucede, el motor de layout generará una exception. En el caso de UITableView, mi conjetura es que el método tableView: numberOfRowsInSection: se invoca en algún lugar dentro del método interno de presentación de vistas de UITableView y este método no llama a [super layoutSubviews]. Entonces, si el método fuente de datos de la tabla actualiza las restricciones internas de la tabla, al final del método se desencadena la exception. La solución que propongo funciona porque la única restricción aplicada a la tabla es la restricción externa hacia el contenedor, por lo que se evalúa en la primera etapa del process de layout, mientras que las restricciones agregadas en el método fuente de datos de la tabla no son relevantes para la tabla, ya que se aplican a las vistas externas a la tabla (contenedor y noArticlesView) para que no afecten el process de layout de la vista interna de la tabla.

 // // RootController.h #import @interface RootController : UIViewController @property (nonatomic,strong) IBOutlet UITableView *table; @property (nonatomic,strong) IBOutlet UIView *container; @end // // RootController.m #import "RootController.h" @implementation RootController #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. UIView *_v = [[UIView alloc] init]; _v.backgroundColor=[UIColor networkingColor]; _v.translatesAutoresizingMaskIntoConstraints=NO; [self.container addSubview:_v]; NSLayoutConstraint *_c1 = [NSLayoutConstraint constraintWithItem:_v attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.container attribute:NSLayoutAttributeTop multiplier:1.0 constant:20.0]; NSLayoutConstraint *_c2 = [NSLayoutConstraint constraintWithItem:_v attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.container attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-20.0]; NSLayoutConstraint *_c3 = [NSLayoutConstraint constraintWithItem:_v attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.container attribute:NSLayoutAttributeLeft multiplier:1.0 constant:20.0]; NSLayoutConstraint *_c4 = [NSLayoutConstraint constraintWithItem:_v attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.container attribute:NSLayoutAttributeRight multiplier:1.0 constant:-20.0]; [self.container addConstraints:@[_c1,_c2,_c3,_c4]]; return 0; } 

Desactive la function de layout automático en el controller de vista. El fallo no se está produciendo ahora.