Deaktivieren Sie die Fehlermeldungen für die automatische Layout-Einschränkung in der Debug-Konsolenausgabe in Xcode


77

Gibt es eine Möglichkeit, Autolayout-Fehler- / Warnmeldungen (vorübergehend) zu deaktivieren:

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
Das Beheben der zusätzlichen Einschränkung ist die einzige Möglichkeit, diese Nachricht zu entfernen.
itsji10dra

4
Nicht der ONLYbeste Weg, um diese Nachrichten loszuwerden
MBH

3
Wenn alle Fehler von iOS verursacht werden und Sie dies nicht beheben können und die Fehler die Protokolle überladen.
Jonny

Antworten:


209

Hat etwas dekompiliert und es gibt tatsächlich einen Weg:

für Swift 5

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

Ziel c

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

Jetzt werden Sie nur benachrichtigt, dass "_UIConstraintBasedLayoutLogUnsatisfiable OFF ist".

Obligatorische Erinnerung für alle, die dies lesen: Dies sollte der letzte Ausweg sein. Tipps zum Debuggen und Beheben von Einschränkungen finden Sie in den WWDC-Sitzungen "Mysteries of Auto Layout": Teil 1 und Teil 2 .


21
Genau - ich musste die Fehler vorübergehend deaktivieren, damit ich etwas anderes beheben und später zum Albtraum des automatischen Layouts zurückkehren konnte. Danke dafür!
Markus Rautopuro

Tolle Antwort Witold! Für diejenigen unter Ihnen, die Swift 3 verwenden: UserDefaults.standard.setValue (false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")
alex1511

1
wie und wo man diese Anleitung benutzt
Android

@ MarkusRautopuro wo sollen wir das laufen lassen?
Vbuzze

Im AppDelegate. Sie können es applicationDidFinishLaunchingzum Beispiel in tun .
Markus Rautopuro

24

Swift 4.0 & Swift 5.0 Lösung:

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

Swift 3.0-Lösung:

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

2
Warum eine neue Antwort mit Duplizierungslösung hinzufügen, wenn eine ursprüngliche Antwort bearbeitet werden kann?
Nik Kov

@NikKov zu diesem Zeitpunkt .. Ich habe keinen Zugriff, um diese Antwort zu bearbeiten. Wie ich mich erinnere.
Sourabh Sharma

11

Eine weitere Option ist das vorübergehende Einfügen -_UIConstraintBasedLayoutLogUnsatisfiable NO(beachten Sie den Bindestrich) in das Arguments Passed On LaunchMenü unter der Product -> Scheme -> Edit Scheme... -> Run -> ArgumentsRegisterkarte (Sie können dieses Menü auch durch Drücken von + + öffnen <) wie folgt:

Geben Sie hier die Bildbeschreibung ein


Toll. Ich denke, dies ist die beste Lösung, um unerwünschte Protokolle zu entfernen
rmvz3

1
Eigentlich kann ich hier nicht herausfinden, was "Ziel" ist. Suchen Sie daher im Dropdown-Menü der Schaltfläche "App-Schema" rechts neben den Schaltflächen "Wiedergabe / Stopp" über XCode nach "Schema bearbeiten"
djdance

6

für alle, die sich fragen, wie man dieses macOS / osx mit AppKit / Cocoa macht

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

Wo sollen wir das laufen lassen?
Vbuzze

1
Ich habe am App-Einstiegspunkt. Wenn es sich um eine App handelt, können Sie dies in applicationDidFinishLaunching in Ihrem AppDelegate
Charlton Provatas

3

Ich habe versucht, dies mit lldb zu lösen und habe eine Lösung gefunden:

  1. Erstellen Sie einen symbolischen Haltepunkt für das Symbol UIViewAlertForUnsatisfiableConstraints im Modul UIKit.
  2. Fügen Sie als Haltepunktaktion den Debugger-Befehl "thread return" hinzu.
  3. Fügen Sie einen zweiten Debugger-Befehl hinzu: "c"
  4. Deaktivieren Sie "Nach Auswertung der Aktionen automatisch fortfahren".

Wenn in Ihrer App ein Layoutproblem auftritt, wird die Ausführung angehalten. Mit der Anweisung "thread return" muss die Funktion UIViewAlertForUnsatisfiableConstraints, die den Fehler ausgibt, zurückkehren, bevor die Warnmeldung in die Konsole gedruckt wird.

Mit dem Befehl "c" wird die Ausführung Ihrer App fortgesetzt (Hinweis: "Nach Auswertung von Aktionen automatisch fortsetzen" funktioniert in diesem Fall irgendwie nicht).

Bei diesen automatischen Aktionen verhält sich der Haltepunkt jedoch wahrscheinlich seltsam, wenn er zweimal getroffen wird Eine Zeile, die zum Absturz Ihrer App führt. Um dies zu lösen, können Sie die Haltepunktaktionen entfernen und die Befehle manuell eingeben, wenn der Debugger die Ausführung des Programms anhält.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.