Diseño automático: removeFromSuperview / removeConstraints lanza una excepción y se bloquea con fuerza


Utilizamos restricciones de diseño automático selectivamente, principalmente para posicionar etiquetas en relación con elementos de campo editables (UITextView, UITextField, típicamente). Sin embargo, desde que implementamos el diseño automático para estos campos, estamos viendo una excepción desagradable y nos bloqueamos cada vez que descargamos vistas, desasignamos, etc. Las excepciones están sucediendo ya que está tratando de eliminar las restricciones de una vista antes de descargarla.

Nuestra jerarquía de vista/controlador es como tal:

UITableViewController (plain style, but with cell appearance to mimic grouped style)
--> UITableViewCell
----> UIViewController (container for editable form)
------> UICollectionViewController (editable form)
--------> UICollectionViewCell
-----------> UIViewController (editable field)
--------------> UILabel (field label)                   **HAS CONSTRAINTS**
--------------> UITextView / UITextField (field value)  **HAS CONSTRAINTS**

Muchos veces cuando las celdas de la tabla de nivel superior están siendo desasignadas / reemplazadas/recargadas, vemos una gran excepción y luego se bloquean ya que está tratando de desasignar / descargar la jerarquía de la vista dentro.

He intentado mitigar el bloqueo capturando la excepción (sin ayuda) y también eliminando por la fuerza todas las restricciones en la vista afectada y todas las subviews antes de la desasignación/descarga (en viewWillDisappear:) y no parece ayudar. Incluso he tratado de eliminar estas restricciones una por una para ver si hay uno en particular que está causando el problema, pero todos ellos están explotando cuando llamamos removeConstraint: o removeConstraints: en un contenedor en preparación para desaparecer.

¡Estoy desconcertado! Aquí hay un fragmento de nuestra excepción: aproximadamente 3000 líneas han sido cortadas, así que si necesita más, simplemente pregunte.

Exception while deallocating view: { Rows:
    0x18911270.posErrorMarker == 4 + 1*0x18911270.negError + 1*0x189112f0.marker + -1*0x189113f0.negError + 1*0x189113f0.posErrorMarker + 1*0x18911a60.marker + -0.5*0x1892dae0.negError + 0.5*0x1892dae0.posErrorMarker + 1*0x18951520.negError + -1*0x18951520.posErrorMarker + -0.5*0x18958090.negError + 0.5*0x18958090.posErrorMarker
    0x189112b0.negError == 12 + 1*0x189112b0.posErrorMarker + -1*0x189112f0.marker + 1*0x189113f0.negError + -1*0x189113f0.posErrorMarker + -1*0x18911a60.marker + 1*0x18925530.marker + 0.5*0x1892dae0.negError + -0.5*0x1892dae0.posErrorMarker + 1*0x1893e080.marker + 0.5*0x18958090.negError + -0.5*0x18958090.posErrorMarker + 1*0x18963640.marker
    0x18911370.negError == 9 + -1*0x189112f0.marker + 1*0x18911370.posErrorMarker + 1*0x18925530.marker + 1*0x1892dae0.negError + -1*0x1892dae0.posErrorMarker + 1*0x1893e080.marker + 1*0x18963640.marker
    0x189113b0.slackMarker == 2 + -1*0x189107d0.marker + 1*0x18910b90.negError + -1*0x18910b90.posErrorMarker + 

      ........ EXPLETIVES DELETED .........

   UITableView:0xca2b000.contentHeight == 36 + 1*0xc221c00.marker
   UITableView:0xca2b000.contentWidth == 704 + 1*0xc239470.marker
   UITableView:0xca2b000.minX == 0 + 1*0xc2a23f0.marker + -0.5*0xc2a2590.marker
   UITableView:0xca2b000.minY == 0 + 1*0xc2a25d0.marker + -0.5*0xc2a2630.marker
   UITableViewCellContentView:0x18ab13d0.Height == 174 + 1*0x18abd4f0.marker
   UITableViewCellContentView:0x18ab13d0.Width == 704 + 1*0x18abd470.marker

      ........ EXPLETIVES DELETED .........

    <NSAutoresizingMaskLayoutConstraint:0x18988bc0 h=-&- v=-&- UIView:0x18911e50.midY == UIView:0x1892d0c0.midY>        Marker:0x18988bc0.marker
    <NSAutoresizingMaskLayoutConstraint:0x18994b40 h=-&- v=-&- UIView:0xc4a6fb0.midX == UIView:0xc4b4990.midX>      Marker:0x18994b40.marker
    <NSAutoresizingMaskLayoutConstraint:0x18998480 h=-&- v=-&- UIView:0x18915180.width == UIView:0xc4c5970.width>       Marker:0x18998480.marker
    <NSAutoresizingMaskLayoutConstraint:0x18aae320 h=--& v=--& TapSectionalTableViewCell:0x18a3d270.midX == + 352>      Marker:0x18aae320.marker
    <NSAutoresizingMaskLayoutConstraint:0x18aae410 h=--& v=--& H:[TapSectionalTableViewCell:0x18a3d270(704)]>       Marker:0x18aae410.marker
    <NSAutoresizingMaskLayoutConstraint:0x18aae450 h=--& v=--& TapSectionalTableViewCell:0x18a3d270.midY == + 144>      Marker:0x18aae450.marker

      ........ EXPLETIVES DELETED .........

    <NSAutoresizingMaskLayoutConstraint:0xc2de2f0 h=--& v=--& TapGenericCollectionCell:0xc2ac500.midX == + 499>     Marker:0xc2de2f0.marker
    <NSAutoresizingMaskLayoutConstraint:0xc2de3b0 h=--& v=--& V:[TapGenericCollectionCell:0xc2ac500(34)]>       Marker:0xc2de3b0.marker
    <NSAutoresizingMaskLayoutConstraint:0xc2de430 h=-&- v=-&- UIView:0x18953f80.height == UIView:0xc2acb20.height>      Marker:0xc2de430.marker
    <NSAutoresizingMaskLayoutConstraint:0xc2de520 h=-&- v=-&- UIView:0x18923af0.height == UIView:0xc2ae570.height>      Marker:0xc2de520.marker
    <NSAutoresizingMaskLayoutConstraint:0xc2de560 h=--& v=--& H:[TapGenericCollectionCell:0xc2ac500(280)]>      Marker:0xc2de560.marker

      ........ EXPLETIVES DELETED .........

    <NSContentSizeLayoutConstraint:0xc2f5730 H:[_UIBaselineLayoutStrut:0x18994a30(0)] Hug:250 CompressionResistance:750>        Marker:0xc2f5730.posErrorMarker
    <NSContentSizeLayoutConstraint:0xc2f5730 H:[_UIBaselineLayoutStrut:0x18994a30(0)] Hug:250 CompressionResistance:750>        Marker:0xc2f5730.posErrorMarker
    <NSContentSizeLayoutConstraint:0xc2f5770 V:[_UIBaselineLayoutStrut:0x18994a30(18)] Hug:250 CompressionResistance:750>       Marker:0xc2f5770.posErrorMarker

internal error.  Cannot find an outgoing row head for incoming head UIView:0x189712b0.Width, which should never happen.'
/**** BEGIN Individual Field Controller - This code is from the base individual field controller used in our editable form collection *****/

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.clipsToBounds = YES;
    self.view.opaque = YES;

    CGRect viewFrame = self.view.frame;
    viewFrame.size = [self defaultFieldSize];
    self.view.frame = viewFrame;

    if (self.backgroundColor) {
        self.view.backgroundColor = self.backgroundColor;
    }
    else {
        self.view.backgroundColor = [UIColor whiteColor];
    }
    [self createLabelAndField];

    [self setLabelAndFieldContraints];

    [self.view addConstraints:self.labelValueConstraints];
    [self.view setNeedsUpdateConstraints];
}

- (void)createLabelAndField {
    [self removeLabelAndField];

    UILabel *label = [[UILabel alloc] init];
    label.font = self.labelFont;
    label.textColor = self.labelColor;
    label.lineBreakMode = NSLineBreakByWordWrapping;
    label.textAlignment = NSTextAlignmentLeft;
    label.adjustsFontSizeToFitWidth = NO;
    label.numberOfLines = 0;

    if (self.backgroundColor) {
        label.backgroundColor = self.backgroundColor;
    }
    else {
        label.backgroundColor = [UIColor whiteColor];
    }

    [self.view addSubview:label];

    self.label = label;


    /// EXAMPLE valueView initialization from a subclass that handles long text

    TapEditableTextView *textView = [[TapEditableTextView alloc] init];
    if (self.hasLabelOverValue) {
        textView.shouldMimicTextField = NO;
    }
    else {
        textView.shouldMimicTextField = YES;
    }
    textView.delegate = self;
    textView.keyboardType = UIKeyboardTypeDefault;
    textView.font = self.valueFont;
    textView.textColor = self.valueColor;
    textView.textAlignment = NSTextAlignmentLeft;
    textView.normalBackgroundColor = self.backgroundColor;
    textView.editable = NO;
    textView.textLines = self.textLines;

    self.valueTextView = textView;
    self.valueView = textView;
    [self.view addSubview:textView];
}

- (void)removeLabelAndField {
    [self clearConstraints];

    if (self.label) {
        [self.label removeFromSuperview];
        self.label = nil;
    }
    if (self.valueView) {
        [self.valueView removeFromSuperview];
        self.valueView = nil;
    }
}

- (void)clearConstraints {
    if (self.isViewLoaded && self.labelValueConstraints) {
        [self.view removeConstraints:self.labelValueConstraints];
    }
    self.labelValueConstraints = nil;
    self.labelToValueHorizConstraint = nil;
    self.valueWidthConstraint = nil;
}

// This is called in our field's viewDidLoad, after we've created our label and valueView (UITextField, UITextView, etc)
- (void)setLabelAndFieldContraints {
    [self clearConstraints];

    self.labelValueConstraints = [NSMutableArray array];

    self.label.translatesAutoresizingMaskIntoConstraints = NO;
    self.valueView.translatesAutoresizingMaskIntoConstraints = NO;

    NSLayoutConstraint *constraint = nil;

    constraint = [NSLayoutConstraint
                  constraintWithItem:self.label attribute:NSLayoutAttributeLeft
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeLeft
                  multiplier:1.0f constant:self.labelValueGap];
    constraint.priority = UILayoutPriorityRequired;
    [self.labelValueConstraints addObject:constraint];


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.label attribute:NSLayoutAttributeTop
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeTop
                  multiplier:1.0f constant:0];
    constraint.priority = 550;
    [self.labelValueConstraints addObject:constraint];


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.label attribute:NSLayoutAttributeBottom
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeBottom
                  multiplier:1.0f constant:0];
    constraint.priority = 400;
    [self.labelValueConstraints addObject:constraint];


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.valueView attribute:NSLayoutAttributeTop
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeTop
                  multiplier:1.0f constant:0];
    constraint.priority = UILayoutPriorityRequired;
    [self.labelValueConstraints addObject:constraint];


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.valueView attribute:NSLayoutAttributeBottom
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeBottom
                  multiplier:1.0f constant:0];
    constraint.priority = 499;
    [self.labelValueConstraints addObject:constraint];


     constraint = [NSLayoutConstraint
                  constraintWithItem:self.valueView attribute:NSLayoutAttributeRight
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeRight
                  multiplier:1.0f constant: -(kDisclosureWidth + self.labelValueGap) ];
     constraint.priority = 901;
     [self.labelValueConstraints addObject:constraint];


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.valueView attribute:NSLayoutAttributeLeading
                  relatedBy:NSLayoutRelationGreaterThanOrEqual
                  toItem:self.label attribute:NSLayoutAttributeTrailing
                  multiplier:1.0f constant:self.labelValueGap];
    constraint.priority = UILayoutPriorityDefaultHigh + 1;
    [self.labelValueConstraints addObject:constraint];
    self.labelToValueHorizConstraint = constraint;


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.label attribute:NSLayoutAttributeBaseline
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.valueView attribute:NSLayoutAttributeBaseline
                  multiplier:1.0f constant:0.f];
    constraint.priority = 600;
    [self.labelValueConstraints addObject:constraint];


    constraint = [NSLayoutConstraint
                  constraintWithItem:self.valueView attribute:NSLayoutAttributeWidth
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view attribute:NSLayoutAttributeWidth
                  multiplier:(1.f - self.labelWidthPercentage) constant:0];
    constraint.priority = 305;
    [self.labelValueConstraints addObject:constraint];
    self.valueWidthConstraint = constraint;


    [self setCompressionAndHuggingForLabelView:self.label];
    [self setCompressionAndHuggingForValueView:self.valueView];
}

- (void)setCompressionAndHuggingForLabelView:(UILabel *)labelView {
    if (!labelView) {
        return;
    }
    [labelView setContentCompressionResistancePriority:510 forAxis:UILayoutConstraintAxisHorizontal];
    [labelView setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
    [labelView setContentHuggingPriority:450 forAxis:UILayoutConstraintAxisHorizontal];
    [labelView setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
}

- (void)setCompressionAndHuggingForValueView:(UIView *)valueView {
    if (!valueView) {
        return;
    }
    [valueView setContentCompressionResistancePriority:509 forAxis:UILayoutConstraintAxisHorizontal];
    [valueView setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];
    [valueView setContentHuggingPriority:300 forAxis:UILayoutConstraintAxisHorizontal];
    [valueView setContentHuggingPriority:650 forAxis:UILayoutConstraintAxisVertical];
}

/****** END Individual Field Controller ******/
Author: Greg Combs, 2013-07-17

13 answers

Tuve una conversación (extensa) con un ingeniero de Apple sobre este accidente.

Aquí están las dos causas más probables:

  1. Tiene una restricción no válida, como view1.left = view2.left + 20 donde view2 es inesperadamente nil, o tiene un multiplicador de 0. Asegúrate de duplicar (y triplicar) tus restricciones para asegurarte de que son correctas. Aquí hay 2 ejemplos de restricciones problemáticas:

    // The first constraint would be a problem if view2 were nil
    [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeBottom multiplier:1 constant:20];
    // The second constraint is a problem because the 0 multiplier causes view2 to be "lost"
    [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view2 attribute:NSLayoutAttributeBottom multiplier:0 constant:5];
    
  2. Usted está golpeando un error en el diseño automático de la fundación interna motor relacionado con la pérdida acumulada de precisión de punto flotante. Cuando se ha bloqueado, la forma en que puede saber que este es el caso es buscar a través del registro de excepciones (grande) en la consola un número de coma flotante muy pequeño (casi cero) como este:

<505:-7.45058e-08>*PWPlotLegendEntryView:0x600000582be0.Height{id: 34609} +

(Busque e- en la salida de la consola para encontrar números pequeños como este.) Este número (-7.45058e-08 en este caso) representa el coeficiente en este punto particular en el tiempo mientras que el motor interno es resolviendo restricciones. En este caso, se supone que el número es exactamente 0, pero debido a la forma en que el motor de diseño automático hace cálculos con números de coma flotante, se ha convertido en un número negativo extremadamente pequeño que explota todo. Si usted puede encontrar un número de este tipo en la salida, usted sabe que usted ha golpeado este error.

¿Cómo se puede solucionar este problema?

Cambiar el orden en que se agregan (activan) restricciones puede terminar cambiando el orden de los cálculos en el motor interno, que como resultado puede hacer que este problema desaparezca ya que las matemáticas se hacen sin ninguna pérdida problemática de precisión.

Este problema parece surgir con más frecuencia cuando ha cambiado la resistencia a la compresión de contenido o las prioridades de abrazo de contenido para las vistas, así que intente comentar cualquier código que lo haga para ver si está causando este error, o reordenar que suceda antes o después en su código de configuración de restricción.

Más detalles sobre mi caso específico:

Me encontré con este accidente en iOS. Los pasos para reproducirlo fueron bastante interesantes:

  1. Un controlador de vista que contiene una vista de tabla fue empujado en la pantalla (en un controlador de navegación).
  2. La vista de tabla tenía que contener suficientes celdas para que no cabieran todas en el área visible, luego tenía que desplazarse hasta la última celda y luego retroceder un poco (presumiblemente, esto estaba causando que las celdas se reutilizaran, lo que desencadenaba este problema).
  3. Entonces, cuando el controlador de vista que contiene la vista de tabla se eliminó de la pila de navegación, inmediatamente después de que se completara la animación pop, la aplicación se bloquearía en el punto donde la vista del controlador de vista se eliminó de la jerarquía de vistas.

Después de mucho ensayo y error, pude aislar el problema a una cosa específica: establecer la resistencia a la compresión de contenido y las prioridades de abrazo para un UIImageView en cada una de las celdas de la vista de tabla. En este caso, la vista de imagen se está posicionando usando el Diseño automático dentro de la celda, y para lograr el diseño correcto, la vista de imagen debe ser exactamente su tamaño de contenido intrínseco (el tamaño de su imagen).

Este fue el código problemático:

// Inside of the UITableViewCell's updateConstraints method...

[self.imageView setContentCompressionResistancePriority:​UILayoutPriorityRequired forAxis:​UILayoutConstraintAxisHorizontal];        
[self.imageView setContentCompressionResistancePriority:​UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];       
[self.imageView setContentHuggingPriority:​UILayoutPriorityRequired forAxis:​UILayoutConstraintAxisHorizontal];      
[self.imageView setContentHuggingPriority:​UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];

Eliminar el código anterior y reemplazarlo con 2 restricciones (con prioridad requerida) para fijar el ancho y alto de la vista de imagen al tamaño de la imagen logró el mismo resultado, pero evitó el bloqueo. Aquí está el código de reemplazo (usando PureLayout):

[self.imageView autoSetDimensionsToSize:self.imageView.image.size];

I también encontré que solo mover las 4 líneas problemáticas a un lugar diferente en mi código de configuración de restricciones resolvió el problema, presumiblemente porque esto cambió el orden de los cálculos lo suficiente como para evitar la pérdida problemática de precisión.

 85
Author: smileyborg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-10 20:38:45

Problema de desasignación-una posibilidad

Su código que funciona con auto-layout bien puede ejecutarse en el subproceso principal, pero uno de los bloques que se ejecuta en segundo plano y usa su vista (quizás indirectamente), puede contener una referencia fuerte a la vista o a uno de sus propietarios como view controller (ese es el comportamiento predeterminado de los bloques de Objective-C). Cuando se ejecuta un bloque de este tipo y se desasignaen una cola en segundo plano, las referencias fuertes que captura se liberan en esa misma cola y bien conocido problema de desasignación.

  1. En su controlador de vista, asegúrese de que está utilizando una referencia débil a self en todos los bloques que no necesitan una referencia fuerte (y pueden ejecutarse en segundo plano). Puedes declararlo así: __weak typeof(self) weakSelf = self; antes del bloque - y usar weakSelf dentro del bloque.

  2. Lo mismo ocurre con cualquier variable local que contenga referencias a sus vistas: asegúrese de que sus valores se capturan como referencias débiles.

Otro posibilidad

En mi trabajo, me he encontrado con un problema similar en iOS 6 cuando la vista oculta participó en el diseño. La eliminación de la vista de la jerarquía (-[UIView removeFromSuperview]) en lugar de establecer la propiedad hidden a SÍ solucionó el problema para mí.

 14
Author: Leon Deriglazov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-02 20:05:09

Tuvo el mismo problema, resuelto mediante la eliminación de restricciones de una en una en IB hasta que se resolvió el bloqueo. Esto lo redujo a la restricción ofensiva. Luego restablecí dicha restricción, pero invertí los elementos:

introduzca la descripción de la imagen aquí

Usted puede ser tan afortunado y ser capaz de resolver sus problemas de AL tan fácilmente.

 3
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-31 03:04:01

Para cualquiera que encuentre este problema en cualquier versión de iOS > 8.0, el estado de Apple docs para usar la propiedad "active" en la NSLayoutConstraint en lugar de las funciones removeConstraint/addConstraint en UIView. Apple Docs addConstraint reference

 2
Author: Brandon Chow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-15 22:04:34

Para hacer que la impresionante respuesta de @smileyborg sea más procesable:

Esto puede suceder si tiene restricciones con multiplicadores que podrían sufrir problemas de precisión de punto flotante.

Para resolver:

  1. Revise todas sus restricciones que tienen multiplicadores (en código de diseño o editando manualmente un guion gráfico/plumín y buscando multiplier=).
  2. Si el multiplicador no es un poder "bonito" de dos flotadores, gírelo al más cercano (puede usar un punto flotante calculadora)

La manera más fácil de hacer 2 es ingresar el número que valora y la calculadora y luego desactivar los bits de menor precisión en la mantisa hasta que el valor coincida con el valor decimal redondeado en la parte inferior de la calculadora.

 2
Author: yonix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-09 14:09:08

En mi caso fue una restricción de ancho proporcional con un multiplicador de 8:9. Lo cambié a las 7: 9 y funcionó.

Por cierto, la forma más fácil de encontrar una restricción es comenzar a eliminar vistas del controlador de vista. Hacerlo utilizando el algoritmo binario:) la eliminación de la mitad de las vistas, luego la mitad de la mitad que hace que la aplicación se bloquee, etc.

 1
Author: Borzh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 13:28:14

Para mí, el problema era que estaba eliminando una restricción en un momento que me convenía, después de llamar a dequeueReusableCellWithReuseIdentifier mientras configuraba las propiedades de mi UICollectionViewCell. La solución era llamar a:

    [_myUICollectionViewCell setNeedsUpdateConstraints];

Y anular:

    -(void)updateConstraints 

Y hacer mi juego allí. Parece que no puedes simplemente eliminar las restricciones cuando quieras.

 1
Author: troppoli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-16 19:41:29

Me encontré con el mismo error en OSX Mavericks con una aplicación de OSX que estoy desarrollando, pero a diferencia de las otras respuestas dadas, definitivamente no tengo ningún otro hilo que interactúe con los objetos de la interfaz de usuario, y la jerarquía de vistas en cuestión es definitivamente visible también. Tampoco estoy usando bloques. Extrañamente, el problema desapareció cuando eliminé una restricción vertical en un campo NSTextField.

FWIW la vista problemática cuya eliminación de su superview causa el "error interno. No se puede encontrar un error "outgoing row head for incoming head" es uno de los muchos controles del panel lateral que juntos presentan las propiedades de los objetos en la vista principal que se pueden cortar, copiar, crear, etc. Esto significa que el usuario puede estar pegando nuevos objetos en la vista principal con bastante rapidez, lo que significa que los controles del panel lateral están siendo destruidos y los nuevos creados muy rápidamente, también. Por supuesto, con todo en el hilo principal, esto no debería hacer una diferencia, pero parece que sí.

La restricción exacta la causa de los problemas fue

[auto addConstraint: [NSLayoutConstraint constraintWithItem: control atributo:NSLayoutAttributeHeight Relacionado por: Nslayoutrelation equal toItem: otro atributo:NSLayoutAttributeHeight multiplicador:1.4 constante: 0.0]];

Donde control es el NSTextField (editable) que causa problemas, y 'other' es otra etiqueta NSTextField (no editable).

 0
Author: Andy Southwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-16 17:38:39

Tengo este problema con MZFormSheetController pod: https://github.com/m1entus/MZFormSheetController/issues/78

Este código se bloquea:

[formSheetController.view addSubview:self.sharePanel];
// ...
[self.sharePanel removeFromSuperview]; // <-- CRASHES HERE

Mi solución es muy extraña pero funciona:

[self.sharePanel removeFromSuperview]; // <-- This line helps to avoid crash
[formSheetController.view addSubview:self.sharePanel];
// ...
[self.sharePanel removeFromSuperview];

Y aquí está sharePanel declaración de propiedad:

@property (weak, nonatomic) IBOutlet UIView *sharePanel;
 0
Author: k06a,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-02 16:07:58

Recibo este bloqueo cuando llamo a removeConstraints: con un argumento nil.

 0
Author: bazik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 15:09:44

Obtuve este bloqueo cuando todavía tengo una restricción faltante en el modo wAnyhAny, arreglando esto eliminó el error.

 0
Author: Özgür,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-27 12:02:35

Como las otras respuestas en este hilo indican, esto es de alguna manera un problema de autoayout/contraint inválido, aunque parece ser muy meticuloso sobre lo que califica como "inválido".

Afortunadamente no había hecho muchos cambios desde mi última confirmación y pude rastrear los cambios ofensivos. Para mí, tener una vista de 10 UIImageView horizontal con igual ancho y una relación de aspecto fija de 2:3 fue el problema.

El bloqueo solo parecía ocurrir después de dejar el UIViewController que contenía esta fila de imagen. Cada UIImageView se estableció en UIViewContentModeScaleAspectFill. Eliminar este cambio de modo de contenido (que se hizo antes de que se establecieran los UIImage) parecía solucionar mi problema, pero no era una solución aceptable. Terminé eliminando la restricción de relación de aspecto y simplemente usando un ancho y altura fijos para cada imagen.

Por qué esto estaba bloqueando mi aplicación no lo sé... El bloqueo también podría SOLO reproducirse en un iPhone 4s con iOS 7.1.2. Traté de reproducir el mismo accidente en un simulador de iPhone 4s con iOS 9.1 sin éxito. Tampoco se bloquearía cuando se ejecuta en un iPhone phsyical 5 con iOS 9.1.

Espero que ayude a alguien por ahí

 0
Author: alexgophermix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-01 23:03:30

Según la documentación de Apple:

Al desarrollar para iOS 8.0 o posterior, establezca la propiedad active de la restricción en YES en lugar de llamar al método addConstraint: directamente. La propiedad active agrega y elimina automáticamente la restricción de la vista correcta.

En mi caso tuve que modificar la restricción de ancho

for var constraint in self.navigationBar.constraints {
            if constraint.identifier == "theProgressWidth" {
                let sizeWidth = self.navigationBar.frame.size.width
                constraint = NSLayoutConstraint(item: progress!, attribute: .Width, relatedBy: .Equal, toItem: self.navigationBar, attribute: .Width, multiplier: ((sizeWidth * (level / 100)) / sizeWidth), constant: 0)
                constraint.active = true
            }
        }
 0
Author: Arben Pnishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 13:28:02