在 xcode 8.3 中创建一个仅限 XIB 的 Cocoa 项目

Posted

技术标签:

【中文标题】在 xcode 8.3 中创建一个仅限 XIB 的 Cocoa 项目【英文标题】:Create a XIB only Cocoa Project in xcode 8.3 【发布时间】:2017-04-13 17:24:23 【问题描述】:

我正在尝试在 XCode 8.3 中创建一个基于 XIB 的应用程序,但是在没有 Storyboard 的情况下启动项目的选项已被删除。以下是我设置项目的步骤:

    创建一个新的 Cocoa 应用程序。 删除 Main.Storyboard 删除 ViewController.swift 向项目中添加一个新文件 - 一个 Cocoa 类 - 的子类 NSWindowController,同时创建 XIB 文件检查 - 命名 MainWindowController 在常规项目信息下 - 删除对主界面的 Main 的引用

    在应用委托中: 添加 var mainWindowController: NSWindowController? 在 applicationDidFinishLaunching 添加

    让 mainWindowController = MainWindowController(windowNibname: "MainWindowController")

    mainWindowController.showWindow(self)

    self.mainWindowController = mainWindowController

    在信息部分下的项目首选项中添加 主 nib 文件基本名称 MainWindowController

当我运行它时确实会显示我的窗口,但是我得到了错误:

无法将(窗口)出口从(NSApplication)连接到(NSWindow):缺少设置器或实例变量

如果我添加任何控件并连接它们,我会收到类似的错误,指出它们无法连接。

菲尔

【问题讨论】:

【参考方案1】:

Xcode 9 及更高版本的更新

在 Xcode 9.0 及更高版本(至少通过 9.4 beta 1)中,您可以再次将 Cocoa App 项目模板配置为具有 MainMenu.xib 而不是 Main.storyboard。只需确保在为新项目选择选项时未选中“使用情节提要”选项:

原创

您的“主界面”设置应指向包含应用程序主菜单栏的情节提要或 XIB。您可以使用“应用程序”文件模板或“主菜单”文件模板创建包含主菜单栏的 XIB。

以下是从头开始创建一个项目的步骤,该项目在一个 XIB 文件中具有主菜单栏,在一个单独的 XIB 文件中具有窗口:

    使用“Cocoa Application”模板创建一个新项目。

    删除“Main.storyboard”和“ViewController.swift”(或“ViewController.h”和“ViewController.m”)。

    使用用户界面部分中的“主菜单”模板创建一个新文件(文件 > 新文件...)。将其命名为“MainMenu”(Xcode 会自动添加“.xib”扩展名)。

    在目标的常规设置选项卡中,将主界面设置从“Main”更改为“MainMenu.xib”。

    在“MainMenu.xib”中,添加一个 NSObject 到文档大纲。将其自定义类设置为“AppDelegate”。演示:

    在“MainMenu.xib”中,将“File's Owner”(应具有“NSApplication”类)的“delegate”出口连接到“App Delegate”对象。为此,请按住控制键并从文档大纲中的“文件所有者”拖动到“应用程序代理”。然后从弹出列表中选择“委托”。

    使用“Cocoa Class”模板创建一个新文件。将类名设置为“MainWindowController”,将子类名设置为“NSWindowController”。确保选中“同时为用户界面创建 XIB 文件”。

    在“MainWindowController.swift”中,为windowNibNameowner 添加覆盖:

    class MainWindowController: NSWindowController 
    
        override var windowNibName: String?  return "MainWindowController" 
        override var owner: AnyObject  return self 
    

    在“AppDelegate.swift”中,添加代码以创建并显示MainWindowController的窗口:

    class AppDelegate: NSObject, NSApplicationDelegate 
    
        func applicationDidFinishLaunching(_ aNotification: Notification) 
            mainWindowController = MainWindowController()
            mainWindowController!.showWindow(nil)
        
    
        var mainWindowController: MainWindowController?
    

您现在可以在“MainWindowController.xib”中创建其他对象并将它们连接到“MainWindowController.swift”中的插座和操作。

【讨论】:

我不明白你为什么不使用 Application xib 模板。 您当然可以使用应用程序模板。我假设,也许是错误的,但基于问题中的步骤,Phil 想要一个项目,其中他的窗口位于它自己的 XIB 中。我的回答创建了一个以这种方式组织的项目。 我不确定应用程序 xib 模板的含义。我知道在以前版本的 xcode 中,在创建新项目时有一个复选框说“使用情节提要”,您可以不选中它。这将创建一个基于 xib 的应用程序,但在 xcode 8.3 中已将其删除,因此默认的新可可应用程序会创建一个故事板。我正在尝试跟随 Big Nerd Ranch 的书“Cocoa Programming for OSX”,他们在示例中没有使用 Storyboard,但显然还没有针对 xcode 8.3 进行更新。非常感谢 Rob 的帮助。 我更新了我的答案,屏幕截图显示了在哪里可以找到包含主菜单栏的两个模板。 我是 Swift 开发的新手(一般来说也是 Xcode 的新手),所以我不知道这是什么意思:“在“MainMenu.xib”中,将 NSObject 添加到文档大纲。将其自定义类设置为“AppDelegate”。”我看到了文档大纲,但是如何向其中添加对象?

以上是关于在 xcode 8.3 中创建一个仅限 XIB 的 Cocoa 项目的主要内容,如果未能解决你的问题,请参考以下文章

xCode 8.3 的 xib 中的布局被破坏

Xcode 5 - iOS - 如何在没有 Storyboard 或 XIB 的情况下在 Xcode 中创建视图控制器以及如何将其配置为 AppDelegate 作为根视图

在 XCode 5 中创建新的“单一视图应用程序”时没有 .xib 文件

如何在 Xcode 中创建自定义 UIView?

无法为自定义 UITableView 单元设置约束,在 xib 中创建,因为所有数据在大小类更改时消失

如何在 Swift Xcode 中创建自定义导航栏?