为啥导入 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 设置为 FirstRunViewControllerFirstRunViewController --> 导入“MainViewController”
登录/注册后,将viewController设置为MainViewControllerMainViewController --> 导入“SettingsViewController”
在需要时提供 SettingsViewControllerSettingsViewController --> 导入“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”错误?