Estoy experimentando un bloqueo extraño en NSOutlineView: cuando hago clic en el botón "Contraer", la aplicación se bloquea inmediatamente e incluso el "punto de interrupción de excepción" no ayuda a ver dónde está el problema.

Intenté ejecutar la aplicación sin depurador y reproduje el problema. Una vez que la aplicación se bloqueó, obtuve la ventana de bloqueo de OSX y pude extraer el mensaje de bloqueo desde allí:

The window has been marked as needing another Update Constraints in Window pass, but it has already had more Update Constraints in Window passes than there are views in the window

También hay pila de llamadas, pero no ayudará ya que se produjo un bloqueo dentro de libsystem_c.dylib, por lo que no lo publicaré aquí.

Parece que hay algún problema con el diseño automático. Absolutamente no tengo idea de los próximos pasos. ¡Por favor, dame un consejo!

Además, una cosa más, que comenzó solo después de la actualización a OSX Mojave.

4
Vlad E. Borovtsov 17 oct. 2018 a las 08:26

2 respuestas

La mejor respuesta

Intente desactivar la casilla de verificación 'Usar diseño automático' en la plumilla (en la pestaña Inspector de archivos). Puede que tenga que desactivarlo para todas y cada una de las vistas.

Además, no está relacionado, pero Mojave te obliga a usar Core Animation. La mayoría de mis plumillas tienen desactivada la "capa de necesidades de conjunto". Sin embargo, en una de mis puntas tenía marcada una casilla de verificación perdida setWantsLayer. cuando lo desmarqué, la vista (NSSearchField) se dibujó correctamente

-2
Keith Knauber 17 oct. 2018 a las 22:02

Después de horas de depuración y pruebas, noté que ese mensaje es causado por un "bucle de diseño infinito".

Un código diferente, relacionado con la vista de esquema, estaba causando el diseño de NSSplitView. Y el método delegado - (CGFloat) splitView:(NSSplitView*)sender constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex ha sido llamado unas 200 veces antes de fallar.

Es difícil captar este bcs, en realidad no es una recursividad infinita, por lo que el depurador no ayuda mucho. Acabo de agregar un código simple que me ayudó a identificar el problema:

static int a = 0; NSLog(@"Layout: %d", a++);

¡Espero que mi experiencia ayude a alguien más!

3
Vlad E. Borovtsov 18 oct. 2018 a las 15:51