【问题标题】: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

标签: ios objective-c iphone xcode uiviewcontroller


【解决方案1】:

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

解决办法:-

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

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

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

【讨论】:

    【解决方案2】:

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

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

    1. B
    2. 一个

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

    1. B
    2. 一个
    3. C

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多