无法实例化名为IBNSLayoutConstraint的类


79

我正在使用XCode6 beta并试用Swift。当我在视图控制器中放置一些自动布局约束时,应用程序崩溃并显示以下错误: Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'


这里没有太多代码:)视图控制器是一个常规的新创建的UIViewController,它具有两个出口以及常规的viewDidLoad和didReceiveMemoryWarning。然后在Interface Builder中有约束。我想我可以在这里添加视图控制器代码。
zbrox

Answers:


217

之所以收到此错误,是因为您已为在运行时删除的IBOutlet设置了约束。当您将约束设置为Interface Builder中的占位符时,会发生这种情况。由于取消了约束,因此在取消归档时会抛出错误,表明无法这样做。

有两种方法可以纠正此问题。

方法1

  1. 右键单击情节提要>打开方式>源代码
  2. 在打开的故事板xml中,搜索placeholder="YES"
  3. 您会发现设置为在运行时删除的约束。从约束中删除占位符属性,保存并关闭。
  4. 运行该应用程序,您的问题应已解决。

方法2

  1. 在Interface Builder中找到导致您的问题的约束。在GUI中取消选中“占位符”选项。这应该是导致崩溃的ViewController中设置为IBOutlet的约束之一。

Interface Builder属性编辑器显示了选中的Placeholder选项。

它应该是这样的:

Interface Builder属性编辑器未选中“占位符”选项。

另类

假设您实际上希望约束是一个占位符,那么您将需要删除所有引用出口。为此,请选择您希望成为占位符的约束。然后打开连接检查器(最右边的按钮,如下所示:(->)),然后删除该约束上可能存在的所有引用出口。


1
如果您希望约束成为占位符怎么办?developer.apple.com/library/ios/documentation/UserExperience/...
丹尼尔Galasko

2
@DanielGalasko如果要使其成为占位符,则不要将其分配给IBOutlet。
桑迪·查普曼

@SandyChapman这很有道理!非常感谢Sandy,您可以在回答中加入这一点,以便我投票赞成吗?
Daniel Galasko 2014年

1
@DanielGalasko,当然。很好,我的回答是假设您想要对IBOutlet进行约束。
桑迪查普曼2014年

@SandyChapman:有没有一种方法可以找出导致此问题的约束条件?我的项目太大,无法通过每个项目,并且堆栈转储没有精确指出哪个约束。另外,我尝试寻找占位符=“ YES”,但在xml中找不到任何内容。
EmbCoder

6

刚才我遇到了同样的问题,以下对我有用。

我在App Store上发布了我的应用程序的工作版本,几天后又重新使用该应用程序,在UITabBarController中点击我的一个选项卡,它崩溃并显示错误:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

我没有我知道的任何占位符布局约束,也没有应定义的约束出口。

对我来说,解决方案是简单地关闭尺寸类别并保留iPhone的尺寸类别数据(App仅适用于iPhone)。这一定删除了我在尺码类中错过的所有内容。我想要大小分类,因此我将它们重新打开,然后该应用程序又可以正常工作了。


谢谢你的文章!刚刚经历过同样的事情,我没有更改应用程序中的任何内容。就我而言,它在加载“ UIPageViewController”时崩溃了。关闭大小类别并重新启用它们可以解决该错误。
nor0x 2016年

谢谢!!与nor0x相同的经验。很奇怪,但是在这里找到解决方案非常好。
安迪·温斯坦

4

这可能不一定是约束问题。对我来说,这是由于未检查适用于我的版式的尺寸等级的“已安装”引起的,请参见此处必须检查安装


1

使用大小类存在一些问题。我从情节提要板属性中禁用了该选项,仅使用自动布局。这不是一个大问题,因为该应用程序仅是iPhone。


禁用“大小类”并运行对我也修复了。然后,我重新启用了大小类,然后它继续工作。
约翰·福勒

1

最终发生在我身上的是,我在Interface Builder中剪切了一个子视图,将其复制到另一个xib中。这使子视图保留在原始xib Interface构建器中,并变为灰色。从子视图的原始位置删除子视图后(通过选择和删除)。我能够摆脱错误。


0

当您选择Xib文件时,在检查器窗口中有一个选项将不使用检查器中“显示自动检查器”下的“使用自动版式”约束。


我知道那个,但是我想为该情节提要使用自动布局。
zbrox


谢谢。我试着和那些玩耍,但这并没有真正的帮助,因为我也使用了大小类。但我会仔细阅读,看看是否错过了一些东西。再次感谢。
zbrox

0

我对滚动视图进行了更改,以便可以使用我在Stackoverflow其他地方找到的解决方案使嵌入在其中的选择器控件正常工作。我的新情节提要仅将这些属性添加到滚动视图中,这对我来说似乎不错。

     delaysContentTouches="NO" canCancelContentTouches="NO"

但是此外,我在另一个场景的情节提要中看到以下新片段:

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

我不知道它从哪里来。起初我忽略了它,因为一切似乎都可以在我的开发机器上找到。但是,当构建是作为Release进行构建并经过测试时,我崩溃了。删除该乱码(?)片段可修复崩溃,并且似乎并未影响其他任何问题。


0

当我在自定义UICollectionViewCell中有一个按钮时,就遇到了这个问题,并且在该类上有一些约束作为IBOutlets。我将按钮从单元格移到了父视图控制器,并且该单元格中仍然引用了IBOutlet,但实际上该单元格上不存在IBOutlets,因此炸毁了所有内容。只需删除那些IBOutlets,一切就可以正常工作了!

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.