为啥导入 ViewController 会导致 Xcode 无法找到另一个 ViewController?

Posted

技术标签:

【中文标题】为啥导入 ViewController 会导致 Xcode 无法找到另一个 ViewController?【英文标题】:Why does importing a ViewController cause Xcode to not be able to find another ViewController?为什么导入 ViewController 会导致 Xcode 无法找到另一个 ViewController? 【发布时间】:2016-04-03 03:32:53 【问题描述】:

我的项目结构/依赖项是:

AppDelegate --> 导入“FirstRunViewController”和“MainViewController”

如果用户已登录,则将 rootViewController 设置为 MainViewController 如果用户未登录,则将 rootViewController 设置为 FirstRunViewController

FirstRunViewController --> 导入“MainViewController”

登录/注册后,将viewController设置为MainViewController

MainViewController --> 导入“SettingsViewController”

在需要时提供 SettingsViewController

SettingsViewController --> 导入“FirstRunViewController”

如果用户选择退出,它会将 viewController 设置为 FirstRunViewController

我的问题

在“SettingsViewController”中导入“FirstRunViewController”(处理注销)会导致 Xcode 无法在另一个不相关的 ViewController 中找到有效的委托。具体错误码为“No type or protocol named ABCDelegate”。

删除“#import”语句将允许代码运行和编译,但禁用注销。

我的问题

为什么会这样?

我怎样才能阻止这种情况发生?

【问题讨论】:

但是 ABCDelegate 是在哪里声明的呢?还请显示实际的导入语句及其所在位置:不要只说“导入”,因为谁知道你真正在做什么?不要描述你的代码; 显示它。如果你这样做,会更加可靠和清晰。 尝试使用@class 代替import 【参考方案1】:

我不确定。但是随着您的流程,我可以感觉到这是由于循环依赖而发生的。

解决办法:-

使用 .pch 文件并将您的所有文件导入 .pch 文件并根据您的要求使用它。

关于.pch文件的详细讨论请查看此。

what-is-prefix-pch-file-in-xcode

【讨论】:

【参考方案2】:

您可能遇到循环依赖问题。我会举例说明。

A 导入 B。A 要求 B 已经编译,以便它可以引用其方法。我们说 B 是 A 的依赖。所以 Xcode 会自动排列它编译事物的顺序:

    B 一个

所以当 A 被编译时,B 已经被编译。但是,当我们添加第三个类 C 时会发生什么。C 导入 A,但 B 导入 C。

    B 一个 C

但是现在当编译器尝试编译B时,C还没有被编译,所以它抱怨找不到C。

但是仅仅改变顺序并不会改变事情,因为 C 需要 A,但 A 需要 B,但 B 需要 C。这是一个循环依赖。

解决此问题的一种方法是创建一个预编译的标头(请参阅 Badal Shah 链接的问题)。这通过本质上保证 C 存在并且还没有被编译来解决问题,并且会让 B 编译成功,从而让整个循环编译成功。

【讨论】:

以上是关于为啥导入 ViewController 会导致 Xcode 无法找到另一个 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从其他文件导入组件会导致“Invariant Violation: Element type is invalid”错误?

为啥选择/读取会导致排他(X)锁?

Python - 直接扩展列表会导致无,为啥?

为啥更改数组的顺序会导致超出时间限制?

为啥 long packageName 会在作为量词导入之前导致换行?

为啥“[[UIDevice currentDevice] identifierForVendor]”会导致内存泄漏?