¿Por qué estoy recibiendo un «Auto de Diseño todavía se requiere después de la ejecución -layoutSubviews» error cada vez que mi aplicación se inicia ahora?

Ya he añadido el siguiente código, cada vez que mi aplicación se 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:

* De terminación de la aplicación debido a uncaught exception ‘NSInternalInconsistencyException’, la razón: «Auto de Diseño todavía se requiere después de la ejecución -layoutSubviews. UITableView la implementación de layoutSubviews necesita llamar a super.’

Lo que en la tierra estoy haciendo mal? Yo llamo a esto el código en tableView:numberOfRowsInSection: cuando hay 0 filas.

  • No es un experto, pero he tenido este problema, y creo que es porque UITableView, implementa su propia versión de layoutSubviews (u otro tipo de métodos como la que es necesaria para el diseño automático). Yo tu pregunta porque me gustaría tener la respuesta 🙂
  • Sí, yo sólo podría tener que volver a usar marcos para esto (lo hice anteriormente), pero de Diseño Auto habría sido agradable de usar. :/
  • Volví a fotograma para esto, pero realmente no es conveniente una vez que todo es con el diseño automático…
  • es uno mismo.vista de una vista de tabla y uno mismo.noArticlesView es un punto de vista que debe de superposición que indica que no hay celdas de la tabla?
  • Bueno, esto es todo operativo en un UITableViewController subclase, así que me imagino que self.view es un formato tableview. Estás en lo correcto acerca de self.noArticlesView.
InformationsquelleAutor Doug Smith | 2013-11-07

9 Kommentare

  1. 14

    Estaba subclases UIScrollView y recibido el mismo mensaje de error en iOS 7 (pero no 8).

    Yo era primordial layoutSubviews en una manera similar a la siguiente:

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

    He resuelto el problema por el movimiento de la llamada a super del layoutSubviews a ser la última cosa en el método:

    - (void)layoutSubviews {
        //code to scroll the view
        [super layoutSubviews];
    }
    • Me encuentro con el mismo problema. Mi -(void)layoutSubViews de la sub-clase de modificar algunos de restricción constante. Llame [super layoutSubviews] antes de la modificación de restricción accidente en iOS7 (pero no 8).
  2. 2

    Tenía el mismo problema. Agregó vista(s) a sí mismo.formato tableview y utiliza las restricciones. No agregue las vistas a la vista de la tabla a través de addSubview: pero añade como encabezado de la(s) pie(s) o de células.

  3. 2

    [auto.ver layoutIfNeeded]

    Espero que esto ayude

    • Por favor, añadir más detalles de su enfoque, y no sólo «one-liner» sin Embargo, gracias por la respuesta.
  4. 1

    para mí es fue este

    self.tableView.backgroundView = self.emptyView;

    He cambiado a este

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

    Usted puede añadir su ‘no hay artículos de la vista» como un encabezado personalizado en la tabla para asegurarse de que está colocado correctamente.

  6. 0

    Una posible solución es no agregar los noArticlesView directamente en la tabla, pero es poner el UITableView dentro de un contenedor UIView (eventualmente configuración de las restricciones de la tabla para que se ajusten al marco de contenedor) y, a continuación, la restricción de su noArticlesView para el envase, el uso de las mismas limitaciones que establezca y en el mismo lugar en el código, que está dentro de la -tableView:numberOfRowsInSection: UITableViewDataSource método.
    He probado con un simple ejemplo, y funcionó.

    Los cambios que usted necesita para aplicar su código para reemplazar el UITableViewController con un UIViewController, añadir un contenedor de vista (a menos que usted quiere que su mesa para que se ajuste exactamente con el punto de vista del controlador de vista, en tal caso, este punto de vista es el contenedor) y, a continuación, la restricción de su noArticleView para el recipiente en lugar de la tabla.
    Mi código de ejemplo está en la parte inferior de esta respuesta.

    Voy a tratar de hacer una posible explicación de la causa del problema y por qué esta solución funciona, pero tenga en cuenta que parte de mi explicación se basa en conjeturas entonces no podía ser completamente exactos.

    Primero de todo, una breve explicación de cómo el punto de vista de la jerarquía de la representación de proceso funciona en iOS. El primer paso para el diseño del motor es determinar el tamaño y la posición de todas las vistas y subvistas en la vista de jerarquía. Normalmente esto se realiza con un enfoque iterativo, donde las auto restricciones de diseño se evalúan, con el fin de determinar el tamaño y la posición de las vistas y subvistas, y luego cada vista -layoutSubviews método es llamado para ajuste fino: esto significa que usted puede cambiar su diseño después de que las restricciones son evaluados. Lo que el motor de diseño requiere es que si el -layoutSubviews cambios en los métodos de las limitaciones de nuevo, a continuación, -[super layoutSubviews] debe ser llamado de nuevo para permitir que el proceso iterativo: si esto no sucede, el motor de diseño plantea una excepción. En el caso de la UITableView mi conjetura es que el formato tableview:numberOfRowsInSection: método se llama en algún lugar dentro de la interna UITableView layoutSubviews método y este método no llame a [super layoutSubviews]. Así que si su tabla de origen de datos método de actualizaciones internas de las restricciones de la tabla, al final del método de la excepción se activa. La solución que yo propongo funciona porque la única restricción aplicada a la tabla es el límite externo hacia el contenedor, por lo que se evalúa en la primera etapa del proceso de diseño, mientras que las restricciones añadido en la tabla de origen de datos método no son relevantes a la mesa, como son aplicadas a los puntos de vista externo a la tabla (contenedor y noArticlesView) de modo que no afecten la tabla interna de la vista de diseño de proceso.

    
    
    //
    // 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 redColor];
        _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;
    }
  7. -8

    Me desactivada diseño automático en el controlador de vista de que el accidente no se está produciendo ahora

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea