在界面构建器中出现未知类

48

我知道这方面有很多问题,但我已经尝试了大部分解决方法,却没有成功。

问题是: 起初,我无法从助理编辑器中添加我的类,因为自定义类没有识别它。

  1. 我确保调用继承自UIViewController。
  2. 我确保将该类添加到目标中。
  3. 我尝试删除该类文件并重新添加它。
  4. 最后,我通过Storyboard XML添加了该类,并出现在自定义类中。

现在我正在尝试将按钮、视图等连接到它的输出口。看起来它们已经连接,但当运行应用程序并打开该视图控制器时,应用程序崩溃,并且调试器输出以下内容:

"Unknown class xxx in Interface Builder file." "this class is not key value coding-compliant for the key btnMenu."

我已检查:

  1. 连接检查器设置正确(输出口没有错误)
  2. 尝试删除派生数据。
  3. 清除项目。
  4. 重新安装应用程序。

我甚至尝试重新启动我的Mac,但毫无成功。

能否有人在这里提供一些提示呢? 谢谢。


1
在Storyboard中自定义类下面的“模块”文本字段中是什么? - Paulw11
@Paulw11,它显示“无”。 - Max
3
你正在使用Swift吗?如果是的话,应该会显示“current - projectname”。在模块下拉菜单中看到了什么? - Paulw11
这对于Objective-C是正确的。这是您的初始视图控制器还是另一个视图控制器? - Paulw11
让我们在聊天室里继续这个讨论 - Paulw11
显示剩余2条评论
13个回答

97

我最近在使用 Xcode 9 beta 2 和 Swift 4 写一个 UIViewController 子类时遇到了这个问题,解决方法是在 IB 中设置 Custom Class 的地方勾选 'Inherit from Target'。

如果你的视图在一个 .bundle 文件中(如框架/静态库),并且该文件被复制到不同的目标中,则需要为每个 xib/storyboard 类设置显式模块目标,而不是继承它所在的目标。


4
如果“从目标继承”已经被选中,请取消选中并重新选择它。这对我有用。 - Chetan Rajagiri
1
它不起作用,我甚至尝试了选择和取消选择,然后再次选择,但它仍然不起作用,我快要疯了。目前还没有找到解决方案。 - ACAkgul
在我的情况下,我已经包含了代码库中 Objective-C 部分的一个类,并在桥接文件中包含了头文件。如果我勾选了“从目标继承模块”,它会崩溃/失败,如果我取消勾选,它就会成功。 - ColinMasters

28

对我来说,问题是该类不是目标成员的一部分。只需将该类添加到目标中,您就应该在界面构建器上看到它。这在我的情况下有所帮助。

在此输入图片描述


1
你节省了我数小时的调试时间,避免了“此类不符合键值编码‘keyname’”错误,非常感谢! - Ahmed Ghoneim
太好了!它有帮助! - dmaulikr

24
在查看视图控制器部分的自定义类中,勾选名为“从目标继承模块”的选项后,它可以正常工作。可以参照下面的图片进行操作。
要找到此选项: 选择您的视图控制器黄色按钮 > 然后单击“显示身份信息检查器” > 再勾选名为“从目标继承模块”的选项。
请参考以下 enter image description here 的图片。

3

就像@Anthony Scott所说的那样,直到你有Framework_A依赖于Framework_B并且类是来自Framework_B :) 那么您需要取消复选框并提供包含给定类的模块。顺便问一下,感谢这个问题。我正在为其他框架使用Commons框架,并且它帮助我意识到了这一点;)对于那些开发自定义Cocoa Touch框架的人来说,这可能会很有帮助。


2
我曾遇到一个关于自定义UIView的问题,这个UIView在一个框架中。我建立了一个简单的应用,在Storyboard的默认ViewController中创建了一个UIView,并将其类设置为MyCustomView。但是,每当应用程序启动时,我总是会遇到“接口生成器中的未知类”错误。我已经导入了我的框架,并在构建产品中检查了框架是否存在。
问题在于我的测试应用程序代码实际上从未使用过这个框架。尽管故事板引用了它,但我想它从未被加载。当我在测试应用程序代码中添加了[MyCustomView load];后,所有问题都解决了。

这对我有用。但愿有更优雅的解决方案。 - Nicolas Miari

2
对于那些在Storyboard中使用PKCanvasViewARView等系统类遇到此问题的用户,请注意以下步骤。首先将视图的Custom Class设置为任意一个系统类,然后确保Module设置为None。接下来,在目标的Build Phases中的Link Binary with Libraries手动链接包含该类的框架。最后一步是进行清理并删除派生数据(否则问题不会消失)。

老兄,你太牛了!我尝试了30多个不同的答案来解决这个问题,而你的方法成功了。 - MuSoundiX

2
如果您想为ViewController分配一个类,请确保您创建的类继承自UIViewController。如果xCode无法识别您的类,唯一的原因是它是不同类型的实例,比如UITableViewController类型。
请首先检查您的类的继承关系。

复制 className 并粘贴到 assign class 字段中。如果出现编译错误,则存在类不兼容性,否则可能是您的 xCode IE 不正常工作。 - Natasha

1

好的,我不知道如何以及为什么,但是我又做了(再次)我之前尝试过的事情,具体包括:

  1. 删除类
  2. 使用新名称创建相同的类
  3. 在故事板中删除场景并重新创建
  4. 按照通常的方式将它们全部连接起来

现在似乎Xcode知道我的类了...... 我仍然不知道问题出在哪里,但我猜测它与链接器有关。


5
将近2年过去了,Xcode 9.3 Beta 4仍存在这个问题。我的解决方法是从IB中删除自定义类名。确保移出该字段后,清除Build文件夹、手动删除所有缓存和派生数据文件夹,重启计算机,编译项目并确保编译成功。然后在IB中重新添加新的类名,并重置所有缺失的连接。就像一句话里说的那样,它就能正常工作了。我的情况是将Objective-C类转换为Swift。是的,一切都连接得正确。 - Neil

1
我之所以遇到这个错误,是因为我在创建类文件时意外将其保存到了Base.lproj文件夹中。
我通过在项目导航器中右键单击该文件并删除对其的引用来修复了该错误。然后,我通过Finder将该文件移动到正确的文件夹中。然后我右键单击项目导航器中的主组,并单击“添加文件到“组名”...”,选择该类并单击“添加”按钮。
之后,错误消失了。

0
我发现我的问题是,我指向的UIViewController没有附加ViewController.swift文件到其“自定义类”参数!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接