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.
Markus Rautopuro
quelle
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 .

Witold Skibniewski
quelle
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")
Sourabh Sharma
quelle
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

Danylokos
quelle
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")
Charlton Provatas
quelle
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.

Palle
quelle