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

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

  1. 创建一个新的 Cocoa 应用程序。
  2. 删除 Main.Storyboard
  3. 删除 ViewController.swift
  4. 向项目中添加一个新文件 - 一个 Cocoa 类 - 的子类 NSWindowController,同时创建 XIB 文件检查 - 命名 MainWindowController
  5. 在常规项目信息下 - 删除对主界面的 Main 的引用
  6. 在应用委托中: 添加 var mainWindowController: NSWindowController? 在 applicationDidFinishLaunching 添加

    让 mainWindowController = MainWindowController(windowNibname: "MainWindowController")

    mainWindowController.showWindow(self)

    self.mainWindowController = mainWindowController

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

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

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

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

菲尔

【问题讨论】:

    标签: cocoa swift3 interface-builder xcode8 xib


    【解决方案1】:

    Xcode 9 及更高版本的更新

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

    原创

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

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

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

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

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

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

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

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

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

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

      class MainWindowController: NSWindowController {
      
          override var windowNibName: String? { return "MainWindowController" }
          override var owner: AnyObject { return self }
      
    9. 在“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”。”我看到了文档大纲,但是如何向其中添加对象?
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2013-01-26
    相关资源
    最近更新 更多