【问题标题】:Error in Xcode 6 - view controller does not have an outlet named (subview)Xcode 6 中的错误 - 视图控制器没有名为(子视图)的插座
【发布时间】:2014-11-13 22:15:19
【问题描述】:

我刚刚在我的一个应用程序中遇到了这个错误,在检查了其他一些应用程序后,同样的错误发生了。我的IBOutletsIBActions 都没有连接了。当我通过 control 拖动到 .h 文件中重新创建插座时,插座仍然在 Connections Inspector > Outlets 中显示错误,说(视图控制器)没有出口命名(子视图)。在今天之前我没有这个问题,那么与Xcode 6有关吗?视图控制器在 Identity Inspector > Custom Class 下引用了正确的类。我删除了派生数据文件夹,删除了对 .h 文件的引用,清理了项目,清理了构建文件夹。这些都没有奏效,在解决此问题之前,我无法继续开发。

更新:几天后我才重新打开项目,我的插座旁边不再有感叹号,我断开连接的“easyLabel”插座又出现了。我没有改变任何东西,所以我猜这是 Xcode 6-6.1 中的一个错误。

更新 2:此错误再次出现。每个插座旁边都有感叹号。如果我删除它们,我将无法重新添加它们。无法创建新的网点。也不能给视图控制器一个自定义类。我真的只是想在应用程序上取得一些进展,但这个问题不断重复。实在是再也忍不住了。任何帮助将不胜感激。

【问题讨论】:

  • 从 beta 3 开始,我在 Xcode 6 的每个版本中都遇到过这个问题。据我所知,它在 GM Seed 中仍未修复。这非常烦人,但使用 Xcode 5 连接 IBActions 和 IBOutlets 是我目前的解决方法。 (注意:我还没有升级到 Xcode 6.0.1,但如果时间允许,我会在接下来的几天内升级。)
  • 真正令人讨厌的错误。我会尝试 6.0.1 或 6.1,如果不行,我会找到 5.1.1 的下载。
  • 就我而言,我创建了一个新项目并移动文件。现在它可以正常工作了。我不知道,但与 module 相关的东西永远不会出现。
  • 有时看起来连接已经消失,但实际上已经连接。如果不允许您连接它们,请尝试使用右键从小圆圈(IBOutlet 属性左侧)拖动到 IB。另外,尝试下载 Xcode 6.1 并关闭 Xcode。最后转到产品并按住 Alt,clean 选项将更改为 clean build 文件夹...尝试一下
  • 我已经尝试了所有这些方法。项目构建完成,一切正常,但是当我断开插座时,我无法重新连接。

标签: ios objective-c xcode


【解决方案1】:

重复:Xcode 6: can't connect any IBOutlet to ViewController,但这是诀窍:

您还可以看到父视图和自定义类之间的链接断开(不再可见),这是一个大问题。

我在实际使用的应用程序中遇到了完全相同的问题,将 Xcode 从 5.xxx 更新到 6.1。对我有用的解决方法是删除每个视图控制器的引用并将它们重新添加到项目中......不幸的是,在某些情况下,实际上,当 XCode 关闭时,所有连接都会再次丢失。

对于面临这个问题的每个人来说,这是一个(烦人的)技巧:

  • 第 1 步:同时选择 .h 和 .m 视图控制器文件
  • 第 2 步:删除这些文件的引用
  • 第 3 步: 将文件重新添加到您的项目树中
  • 第 4 步:打开故事板,最终重新构建项目并微笑

我能理解那些事情可能真的很烦人,但它对我有用......希望它对其他人有帮助!

【讨论】:

  • 这已经为我工作了两次。一次(我认为)在执行 Xcode 升级后,再次使用全新的类文件和全新的 xib 文件。很糟糕,我们不得不像这样跳槽,只是为了解决一个原本不应该发生的问题。
  • 我现在在使用 Xcode 6.3 时遇到了这个问题...您的解决方案有效。删除了控制器源文件的引用,然后重新添加它们。这是一个糟糕的错误,Apple...
  • 只需要在 Xcode 9 中执行此操作,有人提交了友好的雷达吗?
  • 不是我,再也不需要这样做了:/
  • Xcode 11 中仍然存在问题。删除并重新添加了自定义 ViewController 类以修复
【解决方案2】:

我遇到了完全相同的问题,而我的故事板被破坏的是我的项目位于文件夹 /Dropbox (MyName)/projects/ 中

显然,带有空格和 ( ) 的保管箱文件夹的名称完全破坏了我的故事板,尝试我所做的并将您的项目完全移动到另一个文件夹,看看是否有帮助:)

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,将 identity Inspector > Custom Class 下的类更改为其他内容,保存它,然后再次将其设置为正确的,之后连接正常显示。

    【讨论】:

    • 我什至无法更改 UIViewController 的类。如果我创建一个新的 UIViewController 类并尝试更改情节提要中的自定义类,则该新类不会显示在列表中。几周来我一直无法在任何应用上取得任何进展,所以这真的很烦人。
    【解决方案4】:

    我在 Swift UIViewController 子类中遇到了这个问题。我删除了 IB 为我创建的原始视图,并添加了一个新视图——我无法连接。

    我去了文件所有者的身份检查器,并试图重新输入它,认为它可能已被某种方式修改。奇怪的是,类名没有自动完成。 XCode 似乎无法真正看到我的课程。

    我尝试删除并重新添加 .swift.xib 文件,但无济于事。 XCode 将允许我手动输入我拥有的类名,但它不会自动完成。它似乎认为它不存在,或者在这种情况下无效。

    回顾我的代码,我有如下内容:

    extension SomeViewController {
        func foo() -> Bool {
            return false
        }
    }
    
    class SomeViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    

    它编译得很好,但出于预感,我删除了扩展。我保存了文件,返回到.xib,并且能够再次使用自动完成设置文件的所有者身份。我还能够连接视图。

    当然,如果扩展总是破坏事情,那就太糟糕了,所以我又试了一次,这次是在课后扩展:

    class SomeViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    
    extension SomeViewController {
        func foo() -> Bool {
            return false
        }
    }
    

    在 IB 中一切仍然有效。为了进行健全性检查,我将扩展移回了类定义之前,但事情又被吓坏了。

    我查看了 XCode 生成的 *-Swift.h,至少相对于受影响的类,似乎没有区别——无论我将扩展名放在 Swift 文件的什么位置,它们总是被声明在标题中实际类的@interface 定义之后。

    所以,长话短说,在我的情况下,这是由于 Swift 扩展(我说扩展是因为我的实际代码有很多)出现在类定义之前。我在类定义之后移动了它们,问题就消失了。

    【讨论】:

    • 第一个tnx非常详细的解释。 Xcode 8.3.2 中仍然存在同样的问题。编译时间慢是一个问题,但这表明Apple甚至不知道如何编译。我很生气。
    • 是的。 Swift UITableViewCell 子类在扩展中命名空间:Interface Builder 找不到 IBOutlets。
    【解决方案5】:

    对我来说,我必须删除引用并将视图控制器的 -XIB- 文件添加回我的项目。简单地删除视图控制器 .h/.m 并没有重置插座,但删除 .xib 并将其添加回来!

    【讨论】:

      【解决方案6】:

      如果我不在实现类中重新定义@protocol 定义IBOutlets,我只会遇到这个问题。

      可能我们唯一能做的就是提交bug

      【讨论】:

      • 真遗憾,最严重的问题是苹果公司的问题。我已经提交了一个错误。
      【解决方案7】:

      为什么不将你的 xcode 6.0.1 更新到 xcode 6.1,Apple 已经修复了许多错误。

      下载Xcode 6

      【讨论】:

      • 我正在运行 6.1。我在 6 和 6.0.1 中遇到了问题,更新到 6.1 暂时解决了这个问题。然后几天前我打开了一个项目,它失去了插座连接。
      • 我用 6.2 得到它。反复。所以更新到 6.1 听起来并不是一个特别合理的解决方案。
      【解决方案8】:

      如果您在 Interface Builder 而不是助手编辑器中连接操作/出口,您会遇到同样的问题吗?对于操作,请尝试控制从 IB 中的对象拖动到您的第一响应者对象(或您的类设置的任何对象)。

      【讨论】:

      • 是的,我遇到了同样的问题。它只是自己修复的,我没有改变任何东西。希望这个错误在 Xcode 6.2 中得到修复。
      【解决方案9】:

      @robb 实际上发现了解决此问题的方法,但他发现的问题是项目中镜像磁盘上的文件夹的组使用了不同的情况。

      所以如果项目组是 Broken/classone.m

      在磁盘上它被破坏/classone.m

      界面生成器找不到文件。重命名组或文件夹以匹配大小写解决了问题。

      【讨论】:

        【解决方案10】:

        我遇到了同样的问题,但这是因为我将 Project Navigator 中的视图控制器的名称更改为 MapViewController 但它的名称保持不变(ViewController)在代码中。一旦我改变了它,它就起作用了

        【讨论】:

        • 你救了我!它解决了我的问题
        【解决方案11】:

        自从使用 XCode 6.1 以来,我也遇到了同样的问题,上面的答案对我不起作用。 (删除/重新添加我的类文件,将类更改为其他内容,然后将其更改回来。我唯一没有尝试的是从头开始创建一个新项目)。

        我偶然注意到 MainMenu.xib 中的“应用程序”占位符不知何故将其类设置为 NSObject。将其更改为 NSApplication 似乎从我的所有其他对象中清除了“没有名为插座”的问题。

        【讨论】:

        • 我在哪里可以找到这个'Application' placeholder
        • 在 mainmenu.xib 主视图左侧的大纲侧边栏中。在顶部:占位符>文件的所有者、第一响应者和应用程序
        • 找不到。这是一个xib文件,而不是故事板,这可能是问题吗?我找到了First Responder,但没有找到Application。它在右侧边栏中吗?如果是,在哪个选项卡上? (文件检查器,快速帮助检查器,...)
        • 我刚刚注意到这个特殊问题与 iOS 有关,而我的回答与 OSX 项目的相同问题有关。抱歉,我会将我的答案粘贴到一个类似的 OSX 问题中,也许版主希望在您看到这个答案后从这个问题中删除我的答案。
        【解决方案12】:

        大约两个月前,我将我的项目从 Xcode 6.x 更新到 Xcode 7.x,没有任何问题。但是今天早上我遇到了这个错误。我在此页面上尝试了几乎所有内容,但没有任何效果。但后来贾斯汀米德尔顿的解决方案给了我一个想法。

        当我将项目从 10.9 SDK 切换到 10.11 SDK 时,我决定希望我的代码保持向后兼容,以防万一我不得不恢复到 Xcode 6.2。所以我把预处理器代码放在我的几个对象声明周围,例如:

        // This caused the (!) problem in Interface Builder
        
        #if( MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_10 )
        @interface CLChatWindowController : NSObject <WebPolicyDelegate, WebUIDelegate, WebFrameLoadDelegate>
        #else
        @interface CLChatWindowController : NSObject
        #endif
        ...
        
        
        // Removing all the Preprocessor code fixed the problem
        
        @interface CLChatWindowController : NSObject <WebPolicyDelegate, WebUIDelegate, WebFrameLoadDelegate>
        ....
        

        一旦我删除了所有预处理器代码,Interface Builder 中的 (!) 字符就消失了,一切都恢复了正常。希望对某人有所帮助。

        【讨论】:

          【解决方案13】:

          Xcode 6.3.2。类似的问题。我一直在处理的项目突然“断开”IBOutlets 并显示错误

          view controller does not have an outlet named (subview)
          

          该项目仍在构建和工作,如果您将鼠标悬停在代码中的 IBOutlets 上,它认为仍然连接。

          我已将其确定为(至少在我的情况下)在 Dropbox 上存储项目的问题(类似于上述帖子)。对我来说修复非常简单:

          将项目文件夹从 Dropbox 拖到您的桌面。然后将项目拖回 Dropbox。

          此解决方案已解决了许多项目的问题。

          【讨论】:

            【解决方案14】:

            如果缺少头文件,请尝试将其添加到项目中。

            【讨论】:

              【解决方案15】:

              我在 Xcode 7.0.1 的一个 swift 项目中使用了这个。具体来说,tableview 单元连接被破坏(永久),而其他事情仍然有效。删除派生数据、重新启动等 - 没有任何效果。

              我的解决方案最终是:

              1. 关闭 xcode 项目
              2. 删除项目的派生数据(窗口->项目)
              3. 重命名整个项目/源文件夹,即。项目 -> 项目-1
              4. (根据需要更新源管理书签,如 sourcetree)
              5. 在 xcode 中打开项目(来自 finder):请注意情节提要和一些其他文件是红色的。删除引用,重新添加它们。繁荣,它的工作原理。

              请注意,删除对情节提要的引用并阅读它,即使删除了派生数据,也是不够的。整个源文件夹的重命名对我来说是必要的。

              【讨论】:

                猜你喜欢
                • 2023-03-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-06-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多