我看到一个错误出现在我的调试器日志:

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.

我怎么能骗过那个电话?它没有出现在我的代码的任何地方。


当前回答

听从Stephen的建议,尝试调试代码,哇!它工作。答案在于调试消息本身。

会试图通过打破约束来恢复吗 NSLayoutConstraint: 0 x191f0920 H: [MPKnockoutButton: 0 x17a876b0] - (34) [MPDetailSlider: 0 x17a8bc50] (LTR) >

上面的代码行告诉您,运行时通过删除这个约束来工作。也许你不需要水平间距的按钮(MPKnockoutButton)。一旦你清除了这个约束,它就不会在运行时抱怨&你会得到想要的行为。

其他回答

我想我的问题是当我看到这样的东西时:

(
    "<NSLayoutConstraint:0x600002faf7a0 'UISV-alignment' UIStackView:0x7fcdda716770.top == UIStackView:0x7fcdda7291d0.top   (active)>",
    "<NSLayoutConstraint:0x600002f84dc0 'UISV-canvas-connection' UILayoutGuide:0x6000035a8620'UIViewLayoutMarginsGuide'.top == UILabel:0x7fcdda716900.top   (active)>",
    "<NSLayoutConstraint:0x600002f8dfe0 'UISV-spacing' V:[UIImageView:0x7fcdda7170c0]-(2)-[UIStackView:0x7fcdda7291d0]   (active)>",
    "<NSLayoutConstraint:0x600002f84e60 'UISV-spacing' V:[UILabel:0x7fcdda716900]-(2)-[UIImageView:0x7fcdda7170c0]   (active)>",
    "<NSLayoutConstraint:0x600002f84c80 'UIView-topMargin-guide-constraint' V:|-(20)-[UILayoutGuide:0x6000035a8620'UIViewLayoutMarginsGuide']   (active, names: '|':UIStackView:0x7fcdda716770 )>"
)

我猜,恶心。他们并不指望我处理这些垃圾……但也许这就是我们所能得到的,也许并没有那么糟糕。

让我们稍微分解一下,代码指的是约束的id。实际上,你可以通过像这样简单地打印约束来找出它们对应的约束:

print("my Constraint", ibOutletConstraint)

你会得到:

my Constraint Optional(<NSLayoutConstraint:0x600001625a90 UIStackView:0x7fdca0c0d1f0.width == 2*UIStackView: 0x7fcdda716770.width   (inactive)>)

现在我可以获取:0x7fcdda716770并搜索输出以将其与所讨论的约束匹配。它很乏味,当然也不迷人,但这是一种逐步打破它的方法。我认为苹果应该更清楚地说明哪个约束存在问题。

Whenever I attempt to remove the constraints that the system had to break, my constraints are no longer enough to satisfy the IB (ie "missing constraints" shows in the IB, which means they're incomplete and won't be used). I actually got around this by setting the constraint it wants to break to low priority, which (and this is an assumption) allows the system to break the constraint gracefully. It's probably not the best solution, but it solved my problem and the resulting constraints worked perfectly.

听从Stephen的建议,尝试调试代码,哇!它工作。答案在于调试消息本身。

会试图通过打破约束来恢复吗 NSLayoutConstraint: 0 x191f0920 H: [MPKnockoutButton: 0 x17a876b0] - (34) [MPDetailSlider: 0 x17a8bc50] (LTR) >

上面的代码行告诉您,运行时通过删除这个约束来工作。也许你不需要水平间距的按钮(MPKnockoutButton)。一旦你清除了这个约束,它就不会在运行时抱怨&你会得到想要的行为。

您需要添加一个符号断点。苹果为如何做到这一点提供了很好的指导。

打开断点导航器cmd+7(在Xcode 9中cmd+8) 单击左下角的Add按钮 选择添加符号断点… 它说的符号只是输入uiviewalertforunsatisableconstraints

您还可以像对待任何其他断点一样对待它,打开和关闭它,添加操作或日志消息。

这通常出现在你想在iPad中使用UIActivityViewController的时候。

在呈现控制器以标记箭头之前,添加以下内容。

activityViewController.popoverPresentationController ?。sourceRect = senderView.frame // senderView可以是你点击调用这个VC的按钮/视图

我猜你已经有了以下内容,如果没有,把它们加起来:

activityViewController.popoverPresentationController ?。sourceView = self.view