在Xcode的调试控制台输出中禁用自动布局约束错误消息


77

有没有一种方法可以(暂时)禁用自动布局错误/警告消息:

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引起的,那么您将无法解决,并且错误会使日志混乱。
强尼

Answers:


209

做了一些反编译,实际上有一种方法:

对于Swift 5

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

物镜

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

现在,您仅会收到“ _UIConstraintBasedLayoutLogUnsatisfiable为OFF”的通知。

强制性提醒所有阅读此内容的人:这应该是不得已的方法,有关调试和修复约束问题的提示,请参阅WWDC的“自动布局之谜”会议:第1部分第2部分


21
确实-对我而言,需要暂时禁用错误,以便我可以解决其他问题,然后在以后返回自动版式噩梦。谢谢你!
Markus Rautopuro

很好的答案,Witold!对于使用Swift 3的用户:UserDefaults.standard.setValue(false,forKey:“ _UIConstraintBasedLayoutLogUnsatisfiable”)
alex1511

1
如何以及在哪里使用这种技巧
Android

@MarkusRautopuro我们应该在哪里运行它?
vbuzze

在AppDelegate中。applicationDidFinishLaunching例如,您可以在中进行操作。
Markus Rautopuro

24

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")

2
为什么要使用复制解决方案添加新答案,何时才能编辑原始答案。
Nik Kov

@NikKov当时。我无权编辑该答案。我记得。
Sourabh Sharma,

11

另一个选择是将选项卡下的菜单-_UIConstraintBasedLayoutLogUnsatisfiable NO(请注意破折号)暂时置于Arguments Passed On Launch菜单中Product -> Scheme -> Edit Scheme... -> Run -> Arguments(也可以通过按+ +打开此菜单<),如下所示:

在此处输入图片说明


大。我认为这是删除不需要的日志的最佳解决方案
rmvz3

1
实际上,我在这里无法弄清楚什么是“目标”,因此请在“应用方案”按钮的下拉菜单中搜索“编辑方案”,该菜单位于XCode顶部“播放/停止”按钮的右侧
djdance,

6

对于任何想知道如何使用AppKit / Cocoa进行macOS / osx的用户

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

我们应该在哪里运行?
vbuzze

1
我在应用程序入口点做了。如果它是一个应用程序,然后你可以做它的applicationDidFinishLaunching在你的AppDelegate
查尔顿Provatas

3

我试图使用lldb解决此问题,但找到了解决方案:

  1. 在模块UIKit中为符号UIViewAlertForUnsatisfiableConstraints创建符号断点。
  2. 作为断点操作,添加调试器命令“ thread return”
  3. 添加第二个调试器命令:“ c”
  4. 禁用“评估操作后自动继续”

如果您的应用遇到布局问题,则暂停执行。通过指令“线程返回”,在警告消息被打印到控制台之前,将强制返回打印出错误的UIViewAlertForUnsatisfiableConstraints函数。

使用“ c”命令继续执行应用程序(注意:“在评估操作后自动继续”在这种情况下不起作用)。

但是,使用这些自动操作,如果断点两次被击中,断点的行为可能会很奇怪导致您的应用崩溃的行。为了解决这个问题,您可以删除断点操作,并在调试器暂停程序执行时手动输入命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.