gpt4 book ai didi

cocoa - 在 Xcode 6 中使用 Storyboards 的 Cocoa 应用程序的 AppDelegate

转载 作者:行者123 更新时间:2023-12-03 16:07:35 25 4
gpt4 key购买 nike

我有一个现有的 OS X 应用程序,在转换为 Storyboards 作为主界面后,我的应用程序委托(delegate)不再被使用。之前,MainMenu.xib 有一个“App Delegate”对象,我可以将它的类设置为我的应用程序委托(delegate)。但是, Storyboard不包含这样的对象。

如何取回我的 AppDelegate 并保留 Storyboard ?我觉得我错过了一些明显的东西。

最佳答案

如果您没有将其指定为基于文档的应用程序,Xcode 将创建一个 AppDelegate.swift 类并在应用程序场景中为您连接它。

截至目前(Xcode Beta-2),新的基于文档的应用程序不附带 stub AppDelegate.swift 文件。取而代之的是 ViewController.swift 和 Document.swift。更糟糕的是,Document.swift 文件错误地为文档实例化了相同的 Main.storyboard。

这是我让它工作的一种方法:

  • 创建一个 AppDelegate 类(例如:一个采用 NSApplicationDelegate 协议(protocol)的 NSObject)
  • 将 Object 对象从 Object 库中拖到 Main.storyboard 的 Application Scene 中,并将其设置为 AppDelegate 类。
  • 按住 Control 键从 Application Scene 中的 Application 对象拖动到 AppDelegate 对象,并连接其委托(delegate)。
  • 从 Main.storyboard 中删除所有其他内容并为 Document 窗口创建一个新的 Document.storyboard。更改 Document.swift 文件以实例化该 Storyboard 而不是 Main。
  • 如果除了文档窗口之外,您还想拥有一个主应用程序窗口和/或首选项窗口,请为这些窗口创建一个 Application.storyboard 和/或 Preferences.storyboard,并使用 AppDelegate 类来实例化它们。这样,AppDelegate 可以自定义主窗口外观并做其他方便的事情,包括接收从应用程序中的任何窗口发送的 IBAction。

  • 这是基于文档的应用程序的 AppDelegate.swift 文件的工作示例,该应用程序还具有单独的单个主应用程序窗口和 非模态偏好窗口:


    //  AppDelegate.swift

    import Cocoa

    class AppDelegate: NSObject, NSApplicationDelegate {

    //init() {
    // super.init()
    // remove this if you don't use it
    //}

    var application: NSApplication? = nil
    func applicationDidFinishLaunching(notification: NSNotification) {
    application = notification.object as? NSApplication

    let path = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
    let defaults = NSDictionary(contentsOfFile:path)
    NSUserDefaults.standardUserDefaults().registerDefaults(defaults)
    NSUserDefaultsController.sharedUserDefaultsController().initialValues = defaults
    NSUserDefaultsController.sharedUserDefaultsController().appliesImmediately = true

    }

    func applicationDidBecomeActive(notification: NSNotification) {
    if application?.orderedDocuments?.count < 1 { showApplication(self) }
    }

    //func applicationWillFinishLaunching(notification: NSNotification) {
    // remove this if you don't use it
    //}

    func applicationWillTerminate(notification: NSNotification) {
    NSUserDefaults.standardUserDefaults().synchronize()

    }

    func applicationShouldOpenUntitledFile(app: NSApplication) -> Bool { return false }

    func applicationShouldTerminateAfterLastWindowClosed(app: NSApplication) -> Bool { return false }

    var applicationController: NSWindowController?
    @IBAction func showApplication(sender : AnyObject) {
    if !applicationController {

    let storyboard = NSStoryboard(name: "Application", bundle: nil)
    applicationController = storyboard.instantiateInitialController() as? NSWindowController
    if let window = applicationController?.window {
    window.titlebarAppearsTransparent = true
    window.titleVisibility = NSWindowTitleVisibility.Hidden
    window.styleMask |= NSFullSizeContentViewWindowMask
    }


    }
    if applicationController { applicationController!.showWindow(sender) }
    }

    var preferencesController: NSWindowController?
    @IBAction func showPreferences(sender : AnyObject) {
    if !preferencesController {
    let storyboard = NSStoryboard(name: "Preferences", bundle: nil)
    preferencesController = storyboard.instantiateInitialController() as? NSWindowController
    }
    if preferencesController { preferencesController!.showWindow(sender) }
    }

    }

    关于cocoa - 在 Xcode 6 中使用 Storyboards 的 Cocoa 应用程序的 AppDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193238/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com