【问题标题】:Storyboard uiviewcontroller, 'custom class' not showing in drop downStoryboard uiviewcontroller,“自定义类”未显示在下拉列表中
【发布时间】:2012-12-17 07:12:26
【问题描述】:

我有一个我在我的应用故事板中创建的 UIViewController,以及一个我添加到项目中的自定义 UIViewController 子类(并且正确地处于我的目标的编译阶段)。但是,当我在 Storyboard 中的视图控制器上设置“自定义类”属性时,我的自定义类不会显示在列表中。

  • 检查该类是我的应用程序目标的一部分,而不是测试'
  • 仔细检查它是否是 UIViewController 的子类
  • 编译程序只是为了确保 xcode 使用最新信息
  • 重启xcode

什么会导致我的班级没有出现在“自定义班级”下拉菜单中?

【问题讨论】:

    标签: ios storyboard


    【解决方案1】:

    我会尝试以下方法:

    1. 检查实现类的文件是否属于构建阶段(在目标 > 构建阶段下检查)
    2. .m 文件添加到构建阶段(如果尚未添加)。
    3. 重启 Xcode。

    【讨论】:

    • 是的,这是我检查的第一件事,它就在那里。事实上,当我在字段中手动键入类时,我的 NSLog 会在 viewDidLoad 中被调用。真的很烦
    • 哦,如果您手动输入班级名称,它会起作用吗?
    • 那可能只是 XCode 的一个错误。您是否尝试过使用其他自定义类?
    • 如果有人关注:我遇到了问题并且可以确认@tiguero 解决方法仍在 iOS 9.0.1 上运行。
    【解决方案2】:

    我发现有两种方法可以解决问题,但它们是变通方法:-

    1. 只需在文本字段中输入视图控制器名称,或
    2. 关闭项目然后重新打开它,在项目初始化中它会将文件放在列表中。

    【讨论】:

    • 这对我不起作用。我在 4.3.3 和 4.6.2 中尝试过在我开发的早于 4.2 的项目中,现在失去了自定义类!机器设置??当我创建一个新项目时,直到我将工具栏按钮或项目添加到工具栏之前它都很好,然后无论如何它都消失了!
    • 确保你的类继承自 UIViewController。 @interface 类名:UIViewController
    • 关闭了 xcode 项目,它可以工作了。 Xcode 10 中仍然存在错误 =.=''
    • @mikeborgh 感谢您的建议。在我的场景中,我使用的是 UITableViewController,而我的类继承了 UIViewController,因此它不会出现。将其切换为继承 UITableViewController 并且它起作用了。
    【解决方案3】:

    确保你的类继承自 UIViewController。

    @interface ClassName : UIViewController
    

    【讨论】:

      【解决方案4】:

      确保最初不要将 CustomViewController 添加到任何组或文件夹中。将其放在应用的根目录中。

      【讨论】:

        【解决方案5】:

        如果您仍有问题或可能遇到相同问题的人:

        确保在情节提要上选择“ViewController”而不是“视图”(单击情节提要中的视图时会自动选择该视图)。这两个之间的差异是选择视图控制器时,在您的应用周围弹出一个蓝色矩形。要确保选择视图控制器,请打开文档大纲并直接在情节提要层次结构中选择它。

        【讨论】:

          【解决方案6】:

          以上(或以下:)都没有帮助我。虽然我发现了

          1. 将新的视图控制器添加到情节提要后(只需将其拖入)
          2. 并通过 File\New\File\Objective-C 类添加我的类,给它一个名字,没有 XIB,下一步,创建

          如果我在情节提要中选择我的视图控制器并尝试将我的班级分配给它 - 我的班级不在那里

          但是

          如果我单击视图控制器本身中的视图,然后单击自定义类中的类下拉菜单

          然后

          选择视图控制器(点击视图控制器下方的栏),现在再次点击自定义类中的类下拉菜单,我新添加的类神奇地出现了。

          奇怪,一定是刷新的bug。 Xcode 版本 5.1 (5B130a)

          【讨论】:

            【解决方案7】:

            单击故事板中的另一个视图控制器,然后单击它的自定义类下拉菜单以确认新类已列出,但不要选择它。单击您创建的新视图控制器,您应该会看到它现在列在其自定义类下拉菜单中。奇怪,嗯?我认为只是强制刷新。

            【讨论】:

              【解决方案8】:

              确保您选择了您想要将类附加到的视图控制器。最简单的方法是打开Document Outline 并选择您的视图控制器(当您从情节提要中点击它时,有时它根本不会选择您想要的对象)。

              【讨论】:

                【解决方案9】:

                我碰巧遇到了这个问题,在尝试了以前的建议后没有运气。最后我发现原因是头文件的类型设置为C++ header。将其更改为C header(与所有其他头文件一样)后,该类出现在下拉列表中。不知道为什么...可能对其他人有帮助,所以我将其发布在这里。

                【讨论】:

                  【解决方案10】:

                  您可以通过编辑 Storyboard 的 XML 来解决此问题。

                  1. 右键单击 Project Navigator 面板中的 My.storyboard 条目,然后选择 Open As->SourceCode 菜单选项。在 XML 中找到您的视图控制器条目,并添加属性 customClass="MyController"

                  2. 保存情节提要。

                  3. 再次右键单击 Project Navigator 面板中的 My.storyboard 条目,然后选择 Open As->Interface Builder - Storyboard 菜单选项。

                  自定义类条目现在将包含您的 MyController 类名。

                  【讨论】:

                    【解决方案11】:

                    Storyboard 正在寻找自定义类,但实际上它不存在,并且它没有在列表中显示自定义类名称,也没有显示 outlets 。以下解决方案非常适合我。

                    1. 只需将您的代码复制到其他地方即可。(比如说在桌面上)
                    2. 打开现有代码。
                    3. 删除自定义类文件。(移至回收站)
                    4. 现在从复制的项目文件夹中添加文件(从桌面)
                    5. 不要忘记选中“如果需要则复制”复选框
                    6. 打开故事板和宾果游戏,您将在下拉菜单中获得自定义类文件

                    【讨论】:

                      【解决方案12】:

                      就我而言,不知何故捆绑资源被删除了,所以我添加回来并开始工作!

                      构建阶段 -> 添加构建阶段 -> 复制捆绑资源 找到你的文件 然后将您的文件拖放到那里

                      然后确保您的目标成员资格被选中。

                      【讨论】:

                        【解决方案13】:

                        我遇到了与此问题中描述的相同的问题。但是,没有一个建议的答案可以为我解决。我的项目编译正常,没有警告或错误,但是在 .h 文件中没有“出口”指示符表明我的出口已链接到情节提要元素。

                        此外,通过右键单击并拖动到我的头文件中,尝试在我的代码中创建新的出口,并没有将我的头源识别为该操作的潜在目标。此外,我的 Class 没有出现在 ViewController 的属性检查器面板的 Custom-Class 下拉列表中。

                        然而,项目编译成功。

                        仔细检查表明我以以下方式定义了自己的类...

                        @interface KJBMainDataViewTrackConMk2<UIScrollViewDelegate> : UIViewController
                        

                        这显然编译得很好。

                        但是,如果将其更改为以下内容,(将协议移至末尾)...

                        @interface KJBMainDataViewTrackConMk2 : UIViewController<UIScrollViewDelegate>
                        

                        然后一切都焕发生机。所有出口突然被指示为与情节提要元素“连接”。并且右键单击拖动再次开始工作,我的自定义类出现在情节提要 ViewController 的属性检查器面板的自定义类下拉列表中!

                        这里的其他答案可能代表了这种情况的最可能原因,但是,我觉得至少值得一提的是另一个潜在原因。

                        【讨论】:

                          【解决方案14】:

                          就我而言,我选择了错误的 UI.. 所以我删除了类文件并创建了一个新文件并选择了正确的父类

                          【讨论】:

                            【解决方案15】:

                            我遇到了同样的问题,但没有其他解决方案适合我。对我来说,问题是我有一个 Mac 和 iOS 目标,它们都有自己版本的同一个视图控制器。例如,对于 Mac,我有一对名为 FooViewController 的 .h/.m 文件,而对于 iOS,我有一对名为 FooViewController 的 .h/.m 文件。每一对都正确地包含在它们各自的目标中,但由于某种原因,Xcode 不喜欢它,我的视图控制器不会显示在情节提要视图控制器的自定义类下拉列表中。我最终在 iOS 视图控制器中重命名了我的类,它立即出现在下拉列表中。

                            【讨论】:

                            • 在向 iOS 应用程序添加手表应用程序扩展并在手表目标中创建与 iOS 目标中的 UIViewController 类同名的 WKInterfaceController 类时,我遇到了同样的问题。如果 IB 中的类菜单与 iOS 类同名,则它不会显示手表类。如果我手动输入类名,IB 只会显示 iOS 类的出口。有没有办法从特定目标指定一个类?我必须为我的手表接口类的名称加上前缀,我希望避免这种混乱。
                            • 我需要重新审视这个问题。在 Interface Builder 中,有一个下拉列表可以选择类下拉列表下方的目标,但我需要进行试验,看看它是否有效。不知道这个目标下拉是不是新功能。
                            • 谢谢,这已经帮我解决了!
                            【解决方案16】:

                            我不得不重新启动 XCode 7.3 (7D175)

                            【讨论】:

                              【解决方案17】:

                              对我有用的是,单击项目导航器中的文件,然后在“位置”下拉框下方的“身份和类型”下的文件检查器中,单击小文件夹图标,然后选择文件弹出窗口。

                              【讨论】:

                                【解决方案18】:

                                在我的例子中,我将一个新的 TableViewController 对象拖到情节提要中,但我添加了一个新文件,它的子类是“UIViewController”......然后,我添加了一个子类是“UITableViewController”的文件,问题解决了!!

                                【讨论】:

                                  【解决方案19】:

                                  在 Xcode 8 中,我的一些类为其文件位置指定了错误的路径(区分大小写)。

                                  MyProject/mysubdirectory/MyViewController.xib (.m, .h)
                                  

                                  对比:

                                  MyProject/MySubdirectory/MyViewController.xib (.m, .h)
                                  

                                  真的不确定它是如何以这种状态结束的,但我的项目表现出与上述完全相同的行为(IB 中没有显示出口/操作),并且修复该路径解决了问题。

                                  我用两种不同的方式解决了这个问题。一种方法是我打开 .pbxproj 文件并手动修复区分大小写的问题。另一种可行的方法是点击文件的“文件检查器”选项卡的“身份和类型”部分下的文件夹图标,然后在那里重新选择文件。

                                  【讨论】:

                                  • 这个!其他人都没有解决我的问题,这个解决了。
                                  • 非常感谢!同样的问题,不知道文件夹的事情。
                                  【解决方案20】:

                                  尝试清理您的项目,并重新启动您的 Mac。我做的一件特别的事情是更改所有自定义类的名称并再次构建项目。成功了!

                                  【讨论】:

                                    【解决方案21】:

                                    确保ViewController 的类名是您想要的名称。即

                                    class MyCustomNameViewController: UIViewController {
                                    .
                                    .
                                    } 
                                    

                                    仅更改文件名是不够的。

                                    【讨论】:

                                      【解决方案22】:

                                      对于macOS 项目,创建一个新类会生成一个继承自NSObject 的类,而不是NSViewController

                                      改变

                                      import Cocoa
                                      
                                      class AppsViewController: NSObject {
                                      
                                      }
                                      

                                      import Cocoa
                                      
                                      class AppsViewController: NSViewController {
                                      
                                      }
                                      

                                      【讨论】:

                                        【解决方案23】:

                                        对于那些在尝试了所有方法后仍然遇到此问题的人可能是因为您单击了View而不是ViewController

                                        点击ViewController时必须选择文件。

                                        这解决了我的问题。

                                        【讨论】:

                                        • 您的回答对我来说不正确,但让我走上了正轨。问题是我在 Interface Builder 中有一个场景是 UITableViewController,我试图选择一个我不小心将其声明为 UIViewController 的类。转到我的班级并将我继承的内容更改为 UITableViewController 解决了我的问题,因为我故意尝试使用 UITableViewController 但在声明 swift 文件时从错误的基类继承。
                                        • 很高兴我提供了帮助! :) 并感谢您评论您的问题!
                                        【解决方案24】:

                                        我对这个问题感到非常沮丧,因为上面的答案都没有解决我的问题。

                                        在我的例子中:我正在处理 swift view controller 文件并且正在进行积极的更改(例如创建自定义集合单元类)。我还没有完成代码块并像这样打开它:

                                        class tableViewCell: UITableViewCell { 
                                        }
                                        class collectionCell: 
                                        
                                        
                                        class viewController: UIViewController {
                                             override func viewDidLoad(){
                                             super.viewDidload()
                                        
                                             }
                                        
                                        }
                                        

                                        注意不完整的代码块“collectionCell2” 这足以让 xcode 无法识别我的 viewController 文件。 一旦我完成了这个块,文件作为一个选项重新出现在我的 xcode 中。

                                        非常愚蠢和简单。

                                        【讨论】:

                                          【解决方案25】:

                                          确保视图控制器与故事板中的相同类型匹配。

                                          【讨论】:

                                            【解决方案26】:

                                            在我的情况下,swift 文件名与 swift 类名不同,即

                                            文件名为 ViewControllerTest.swift 并且类名是 ViewController.swift

                                            将两者都更改为通用名称后解决了我的问题

                                            上述更改后重启 Xcode

                                            【讨论】:

                                              猜你喜欢
                                              • 1970-01-01
                                              • 2016-10-07
                                              • 2015-12-21
                                              • 2019-03-15
                                              • 2011-07-07
                                              • 2015-07-18
                                              • 1970-01-01
                                              • 2022-08-05
                                              • 2023-03-05
                                              相关资源
                                              最近更新 更多