will uiviewalertforunsatisfiableconstraints the symbolic make debugger constraint catch breakpoint breaking attempt ios autolayout uikit constraints xcode7

ios - the - ¿Cómo atrapar en UIViewAlertForUnsatisfiableConstraints?



make a symbolic breakpoint at uiviewalertforunsatisfiableconstraints to catch this in the debugger (4)

Veo que aparece un error en mi registro de depurador:

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x191f0920 H:[MPKnockoutButton:0x17a876b0]-(34)-[MPDetailSlider:0x17a8bc50](LTR)> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

¿Cómo atrapo esa llamada? No aparece en ninguna parte de mi código.


¡Esta post me ayudó MUCHO !

Agregué el punto de interrupción simbólico UIViewAlertForUnsatisfiableConstraints con la acción sugerida:

Proyecto Obj-C

po [[UIWindow keyWindow] _autolayoutTrace]

Proyecto Swift

expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]

Con esta sugerencia, el registro se hizo más detallado y fue más fácil para mí identificar qué vista tenía la restricción rota.

UIWindow:0x7f88a8e4a4a0 | UILayoutContainerView:0x7f88a8f23b70 | | UINavigationTransitionView:0x7f88a8ca1970 | | | UIViewControllerWrapperView:0x7f88a8f2aab0 | | | | •UIView:0x7f88a8ca2880 | | | | | *UIView:0x7f88a8ca2a10 | | | | | | *UIButton:0x7f88a8c98820''Archived'' | | | | | | | UIButtonLabel:0x7f88a8cb0e30''Archived'' | | | | | | *UIButton:0x7f88a8ca22d0''Download'' | | | | | | | UIButtonLabel:0x7f88a8cb04e0''Download'' | | | | | | *UIButton:0x7f88a8ca1580''Deleted'' | | | | | | | UIButtonLabel:0x7f88a8caf100''Deleted'' | | | | | *UIView:0x7f88a8ca33e0 | | | | | *_UILayoutGuide:0x7f88a8ca35b0 | | | | | *_UILayoutGuide:0x7f88a8ca4090 | | | | | _UIPageViewControllerContentView:0x7f88a8f1a390 | | | | | | _UIQueuingScrollView:0x7f88aa031c00 | | | | | | | UIView:0x7f88a8f38070 | | | | | | | UIView:0x7f88a8f381e0 | | | | | | | | •UIView:0x7f88a8f39fa0, MISSING HOST CONSTRAINTS | | | | | | | | | *UIButton:0x7f88a8cb9bf0''Retrieve data''- AMBIGUOUS LAYOUT for UIButton:0x7f88a8cb9bf0''Retrieve data''.minX{id: 170}, UIButton:0x7f88a8cb9bf0''Retrieve data''.minY{id: 171} | | | | | | | | | *UIImageView:0x7f88a8f3ad80- AMBIGUOUS LAYOUT for UIImageView:0x7f88a8f3ad80.minX{id: 172}, UIImageView:0x7f88a8f3ad80.minY{id: 173} | | | | | | | | | *App.RecordInfoView:0x7f88a8cbe530- AMBIGUOUS LAYOUT for App.RecordInfoView:0x7f88a8cbe530.minX{id: 174}, App.RecordInfoView:0x7f88a8cbe530.minY{id: 175}, App.RecordInfoView:0x7f88a8cbe530.Width{id: 176}, App.RecordInfoView:0x7f88a8cbe530.Height{id: 177} | | | | | | | | | | +UIView:0x7f88a8cc1d30- AMBIGUOUS LAYOUT for UIView:0x7f88a8cc1d30.minX{id: 178}, UIView:0x7f88a8cc1d30.minY{id: 179}, UIView:0x7f88a8cc1d30.Width{id: 180}, UIView:0x7f88a8cc1d30.Height{id: 181} | | | | | | | | | | | *UIView:0x7f88a8cc1ec0- AMBIGUOUS LAYOUT for UIView:0x7f88a8cc1ec0.minX{id: 153}, UIView:0x7f88a8cc1ec0.minY{id: 151}, UIView:0x7f88a8cc1ec0.Width{id: 154}, UIView:0x7f88a8cc1ec0.Height{id: 165} | | | | | | | | | | | | *UIView:0x7f88a8e68e10- AMBIGUOUS LAYOUT for UIView:0x7f88a8e68e10.minX{id: 155}, UIView:0x7f88a8e68e10.minY{id: 150}, UIView:0x7f88a8e68e10.Width{id: 156} | | | | | | | | | | | | *UIImageView:0x7f88a8e65de0- AMBIGUOUS LAYOUT for UIImageView:0x7f88a8e65de0.minX{id: 159}, UIImageView:0x7f88a8e65de0.minY{id: 182} | | | | | | | | | | | | *UILabel:0x7f88a8e69080''8-6-2015''- AMBIGUOUS LAYOUT for UILabel:0x7f88a8e69080''8-6-2015''.minX{id: 183}, UILabel:0x7f88a8e69080''8-6-2015''.minY{id: 184}, UILabel:0x7f88a8e69080''8-6-2015''.Width{id: 185} | | | | | | | | | | | | *UILabel:0x7f88a8cc0690''16:34''- AMBIGUOUS LAYOUT for UILabel:0x7f88a8cc0690''16:34''.minX{id: 186}, UILabel:0x7f88a8cc0690''16:34''.minY{id: 187}, UILabel:0x7f88a8cc0690''16:34''.Width{id: 188}, UILabel:0x7f88a8cc0690''16:34''.Height{id: 189} | | | | | | | | | | | | *UIView:0x7f88a8cc2050- AMBIGUOUS LAYOUT for UIView:0x7f88a8cc2050.minX{id: 161}, UIView:0x7f88a8cc2050.minY{id: 166}, UIView:0x7f88a8cc2050.Width{id: 163} | | | | | | | | | | | | *UIImageView:0x7f88a8e69d90- AMBIGUOUS LAYOUT for UIImageView:0x7f88a8e69d90.minX{id: 190}, UIImageView:0x7f88a8e69d90.minY{id: 191}, UIImageView:0x7f88a8e69d90.Width{id: 192}, UIImageView:0x7f88a8e69d90.Height{id: 193} | | | | | | | | | | | *UIView:0x7f88a8f3cc00 | | | | | | | | | | | | *UIView:0x7f88a8e618d0 | | | | | | | | | | | | *UIImageView:0x7f88a8e5ba10 | | | | | | | | | | | | *UIView:0x7f88a8f3cd70 | | | | | | | | | | | | *UIImageView:0x7f88a8e58e10 | | | | | | | | | | | | *UIImageView:0x7f88a8e5e7a0 | | | | | | | | | | | | *UIView:0x7f88a8f3cee0 | | | | | | | | | | | *UIView:0x7f88a8f3dc70 | | | | | | | | | | | | *UIView:0x7f88a8e64dd0 | | | | | | | | | | | | *UILabel:0x7f88a8e65290''Average flow rate'' | | | | | | | | | | | | *UILabel:0x7f88a8e712d0''177.0 ml/s'' | | | | | | | | | | | | *UILabel:0x7f88a8c97150''1299.4'' | | | | | | | | | | | | *UIView:0x7f88a8f3dde0 | | | | | | | | | | | | *UILabel:0x7f88a8f3df50''Maximum flow rate'' | | | | | | | | | | | | *UILabel:0x7f88a8cbfdb0''371.6 ml/s'' | | | | | | | | | | | | *UILabel:0x7f88a8cc0230''873.5'' | | | | | | | | | | | | *UIView:0x7f88a8f3e2a0 | | | | | | | | | | | | *UILabel:0x7f88a8f3e410''Total volume'' | | | | | | | | | | | | *UILabel:0x7f88a8cc0f20''371.6 ml'' | | | | | | | | | | | | *UIView:0x7f88a8f3e870 | | | | | | | | | | | | *UILabel:0x7f88a8f3ea00''Time do max. flow'' | | | | | | | | | | | | *UILabel:0x7f88a8cc0ac0''3.6 s'' | | | | | | | | | | | | *UIView:0x7f88a8f3ee10 | | | | | | | | | | | | *UILabel:0x7f88a8f3efa0''Flow time'' | | | | | | | | | | | | *UILabel:0x7f88a8cbf980''2.1 s'' | | | | | | | | | | | | *UIView:0x7f88a8f3f3e0 | | | | | | | | | | | | *UILabel:0x7f88a8f3f570''Voiding time'' | | | | | | | | | | | | *UILabel:0x7f88a8cc17e0''3.5 s'' | | | | | | | | | | | | *UIView:0x7f88a8f3f9a0 | | | | | | | | | | | | *UILabel:0x7f88a8f3fb30''Voiding delay'' | | | | | | | | | | | | *UILabel:0x7f88a8cc1380''1.0 s'' | | | | | | | | | | | | *UIView:0x7f88a8e65000 | | | | | | | | | | | | *UIButton:0x7f88a8e52f20''Show'' | | | | | | | | | | | | *UIImageView:0x7f88a8e6e1d0 | | | | | | | | | | | | *UIButton:0x7f88a8e52c90''Send'' | | | | | | | | | | | | *UIImageView:0x7f88a8e61bb0 | | | | | | | | | | | | *UIButton:0x7f88a8e528e0''Delete'' | | | | | | | | | | | | *UIImageView:0x7f88a8e6b3f0 | | | | | | | | | | | | *UIView:0x7f88a8f3ff60 | | | | | | | | | *UIActivityIndicatorView:0x7f88a8cba080 | | | | | | | | | | UIImageView:0x7f88a8cba700 | | | | | | | | | *_UILayoutGuide:0x7f88a8cc3150 | | | | | | | | | *_UILayoutGuide:0x7f88a8cc3b10 | | | | | | | UIView:0x7f88a8f339c0 | | UINavigationBar:0x7f88a8c96810 | | | _UINavigationBarBackground:0x7f88a8e45c00 | | | | UIImageView:0x7f88a8e46410 | | | UINavigationItemView:0x7f88a8c97520''App'' | | | | UILabel:0x7f88a8c97cc0''App'' | | | UINavigationButton:0x7f88a8e3e850 | | | | UIImageView:0x7f88a8e445b0 | | | _UINavigationBarBackIndicatorView:0x7f88a8f2b530 Legend: * - is laid out with auto layout + - is laid out manually, but is represented in the layout engine because translatesAutoresizingMaskIntoConstraints = YES • - layout engine host

Luego detuve la ejecución y cambié el color de fondo de la vista problemática con el comando (reemplazando 0x7f88a8cc2050 con la dirección de memoria de su objeto, por supuesto) ...

Obj-C

expr ((UIView *)0x7f88a8cc2050).backgroundColor = [UIColor redColor]

Swift 3.0

expr -l Swift -- import UIKit expr -l Swift -- unsafeBitCast(0x7f88a8cc2050, to: UIView.self).backgroundColor = UIColor.red

... y el resultado fue increíble!

¡Simplemente asombroso! Espero eso ayude.


Cada vez que intento eliminar las restricciones que el sistema tuvo que romper, mis restricciones ya no son suficientes para satisfacer el IB (es decir, "restricciones faltantes" se muestran en el IB, lo que significa que están incompletas y no se utilizarán). De hecho, resolví esto estableciendo la restricción que quiere romper a baja prioridad, lo que (y esto es una suposición) permite que el sistema rompa la restricción con gracia. Probablemente no sea la mejor solución, pero resolvió mi problema y las restricciones resultantes funcionaron perfectamente.


Querrás agregar un Symbolic Breakpoint . Apple proporciona una excelente guía sobre cómo hacer esto.

  1. Abra el navegador Breakpoint cmd+7 ( cmd+8 en Xcode 9)
  2. Haz clic en el botón Add en la esquina inferior izquierda.
  3. Seleccione Add Symbolic Breakpoint...
  4. Donde dice Symbol simplemente escriba UIViewAlertForUnsatisfiableConstraints

También puede tratarlo como cualquier otro punto de interrupción, activarlo y desactivarlo, agregar acciones o registrar mensajes.


Seguí el consejo de Stephen e intenté depurar el código y ¡vaya! funcionó. La respuesta se encuentra en el mensaje de depuración en sí.

Will attempt to recover by breaking constraint NSLayoutConstraint:0x191f0920 H:[MPKnockoutButton:0x17a876b0]-(34)-[MPDetailSlider:0x17a8bc50](LTR)>

La línea anterior le dice que el tiempo de ejecución funcionó al eliminar esta restricción. Es posible que no necesite Espaciado horizontal en su botón (MPKnockoutButton). Una vez que elimine esta restricción, no se quejará en el tiempo de ejecución y obtendrá el comportamiento deseado.