Вимкнути повідомлення про помилки обмеження авторозкладки у виведенні консолі налагодження в Xcode


78

Чи є спосіб (тимчасово) вимкнути повідомлення про помилки / попередження авторозкладки:

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x170098420 H:[UIView:0x15c62c100(2)]>",
    "<NSLayoutConstraint:0x170098600 UIView:0x15c6294f0.leading == UIView:0x15c628d40.leadingMargin - 8>",
    "<NSLayoutConstraint:0x170098650 H:[UIView:0x15c6294f0]-(0)-[UIView:0x15c62b750]>",
    "<NSLayoutConstraint:0x1700986a0 UIView:0x15c62b750.width == UIView:0x15c6294f0.width>",
    "<NSLayoutConstraint:0x1700986f0 UIView:0x15c628d40.trailingMargin == UIView:0x15c62b750.trailing - 8>",
    "<NSLayoutConstraint:0x170098880 H:[UIView:0x15c6294f0]-(0)-[UIView:0x15c62c100]>",
    "<NSLayoutConstraint:0x1700988d0 UIView:0x15c628d40.centerX == UIView:0x15c62c100.centerX + 1>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x170098420 H:[UIView:0x15c62c100(2)]>

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.

6
Виправлення додаткового обмеження - єдиний спосіб позбутися цього повідомлення.
itsji10dra

4
не ONLYнайкращий, але найкращий спосіб позбутися цих повідомлень
MBH

3
Коли всі помилки спричинені iOS, і ви не можете це виправити, і помилки захаращують журнали.
Джонні,

Відповіді:


213

Зробив декомпіляцію, і насправді є спосіб:

для Свіфта 5

UserDefaults.standard.set(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")

Завдання-C

[[NSUserDefaults standardUserDefaults] setValue:@(NO) forKey:@"_UIConstraintBasedLayoutLogUnsatisfiable"];

Тепер ви отримуватимете лише повідомлення про те, що "_UIConstraintBasedLayoutLogUnsatisfiable вимкнено".

Обов’язкове нагадування для тих, хто читає це: це має бути крайня інстанція, поради щодо налагодження та усунення проблем з обмеженнями див. У сесіях "Загадки автоматичного макетування" WWDC: частина 1 та частина 2 .


23
Точно - мені потрібно було тимчасово вимкнути помилки, щоб я міг виправити щось інше, а потім повернутися до кошмару автоматичного розміщення пізніше. Дякую за це!
Markus Rautopuro

Чудова відповідь Вітольд! Для тих, хто використовує Swift 3: UserDefaults.standard.setValue (false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")
alex1511

1
як і де використовувати цю інструкцію
Android

@MarkusRautopuro, де нам це запустити?
vbuzze

В AppDelegate. applicationDidFinishLaunchingНаприклад, це можна зробити в .
Маркус Раутопуро,

23

Рішення Swift 4.0 і Swift 5.0:

//Hide Autolayout Warning
UserDefaults.standard.set(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")

Рішення Swift 3.0:

//Hide Autolayout Warning
UserDefaults.standard.setValue(false, forKey:"_UIConstraintBasedLayoutLogUnsatisfiable")

3
Навіщо додавати нову відповідь із рішенням дублювання, коли можна редагувати оригінальну відповідь.
Нік Ков,

У той час @NikKov .. Я не маю доступу редагувати цю відповідь. Як я пам’ятаю.
Sourabh Sharma

12

Ще один варіант - тимчасово помістити -_UIConstraintBasedLayoutLogUnsatisfiable NO(зверніть увагу на тире) в Arguments Passed On Launchменю під Product -> Scheme -> Edit Scheme... -> Run -> Argumentsвкладкою (це меню також можна відкрити, натиснувши + + <), наприклад:

введіть тут опис зображення


Чудово. Я думаю, що це найкраще рішення для видалення небажаних журналів
rmvz3

1
Насправді я не можу зрозуміти, що тут таке "Target", тож знайдіть "Редагувати схему" в меню спадного меню кнопки "Схема програми", розміщеному праворуч від кнопок "Відтворити / Зупинити" зверху
XCode

6

для тих, хто цікавиться, як зробити цей macOS / osx за допомогою AppKit / Cocoa

UserDefaults.standard.set(false, forKey: "NSConstraintBasedLayoutLogUnsatisfiable")
UserDefaults.standard.set(false, forKey: "__NSConstraintBasedLayoutLogUnsatisfiable")

куди нам це запустити?
vbuzze

1
я робив у точці входу програми. Якщо це додаток, то ви можете зробити це в applicationDidFinishLaunching у вашому AppDelegate
Charlton Provatas

3

Я спробував вирішити це за допомогою lldb, і я знайшов рішення:

  1. Створіть символічну точку зупинки для символу UIViewAlertForUnsatisfiableConstraints в модулі UIKit.
  2. Як дію точки зупинку додайте команду налагоджувача "повернення потоку"
  3. Додайте другу команду налагоджувача: "c"
  4. Вимкніть "Автоматично продовжувати після оцінки дій"

Якщо у вашому додатку виникає проблема з макетом, виконання призупиняється. З інструкцією "повернення потоку" функція UIViewAlertForUnsatisfiableConstraints, яка виводить помилку, змушена повертатися до того, як попереджувальне повідомлення буде надруковано на консолі.

За допомогою команди "c" продовжується виконання вашого додатка (Примітка: "Автоматично продовжувати після оцінки дій" у цьому випадку якось не працює)

Однак з цими автоматичними діями точка зупинки, швидше за все, поводитиметься дивно, якщо вона потрапить два рази в рядок, який спричинить збій програми. Щоб вирішити цю проблему, ви можете видалити дії точки зупинку та вводити команди вручну, коли налагоджувач призупиняє виконання програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.