Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Xcode 6中的故事板的Cocoa应用程序的AppDelegate_Cocoa_Xcode6 - Fatal编程技术网

使用Xcode 6中的故事板的Cocoa应用程序的AppDelegate

使用Xcode 6中的故事板的Cocoa应用程序的AppDelegate,cocoa,xcode6,Cocoa,Xcode6,我有一个现有的OSX应用程序,在转换成故事板作为主界面后,我的应用程序委托不再被使用。以前,main menu.xib有一个“App Delegate”对象,我可以将其类设置为我的App Delegate。但是,故事板不包含此类对象 如何取回AppDelegate并保留情节提要?我觉得我遗漏了一些明显的东西。如果您不将其指定为基于文档的应用程序,Xcode将创建一个AppDelegate.swift类,并在应用程序场景中为您连接它 截至目前(Xcode Beta-2),新的基于文档的应用程序不附

我有一个现有的OSX应用程序,在转换成故事板作为主界面后,我的应用程序委托不再被使用。以前,main menu.xib有一个“App Delegate”对象,我可以将其类设置为我的App Delegate。但是,故事板不包含此类对象


如何取回AppDelegate并保留情节提要?我觉得我遗漏了一些明显的东西。

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

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

我有一个办法让它发挥作用:

  • 创建AppDelegate类(例如:采用NSApplicationDelegate协议的NSObject)

  • 将对象从对象库拖动到Main.storyboard的应用程序场景中,并将其设置为AppDelegate类

  • 控制从应用程序场景中的应用程序对象到AppDelegate对象的拖动,并连接其代理

  • 删除Main.storyboard中的所有其他内容,并为文档窗口创建新的Document.storyboard。更改Document.swift文件以实例化该情节提要,而不是Main

  • 如果希望在文档窗口之外还有主应用程序窗口和/或首选项窗口,请为这些窗口创建application.storyboard和/或preferences.storyboard,并使用AppDelegate类实例化它们。通过这种方式,AppDelegate可以自定义主窗口的外观并执行其他方便的操作,包括接收应用程序中任何窗口发送的iActions

  • 以下是一个基于文档的应用程序的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) }
        }
    
    }
    
    //AppDelegate.swift
    进口可可
    类AppDelegate:NSObject,NSApplicationDelegate{
    //init(){
    //super.init()
    //如果不使用,请将其删除
    //}
    var应用程序:非应用程序?=无
    func ApplicationIDFinishLaunching(通知:NSNotification){
    application=notification.object as?NSApplication
    让path=NSBundle.mainBundle().pathForResource(“默认值”,类型为“plist”)
    让默认值=NSDictionary(contentsOfFile:path)
    NSUserDefaults.standardUserDefaults().registerDefaults(默认值)
    NSUserDefaultsController.sharedUserDefaultsController().initialValues=默认值
    NSUserDefaultsController.sharedUserDefaultsController().AppliesInstance=true
    }
    func ApplicationIDBecMeactive(通知:NSNotification){
    如果应用程序?.orderedDocuments?.count<1{showApplication(self)}
    }
    //func应用程序将完成启动(通知:NSNotification){
    //如果不使用,请将其删除
    //}
    func应用程序将终止(通知:NSNotification){
    NSUserDefaults.standardUserDefaults().synchronize()
    }
    func应用程序应打开UntitledFile(应用程序:NSApplication)->Bool{return false}
    func应用程序应在LastWindowClosed后终止(应用程序:NSApplication)->Bool{return false}
    var应用程序控制器:NSWindowController?
    @iAction func showApplication(发件人:AnyObject){
    如果!应用程序控制器{
    let storyboard=NSStoryboard(名称:“应用程序”,捆绑包:nil)
    applicationController=storyboard.InstanceInitialController()作为?NSWindowController
    如果let window=applicationController?.window{
    window.titlebarAppearsTransparent=true
    window.titleviability=nswindowtitleviability.Hidden
    window.styleMask |=NSFullSizeContentViewWindowMask
    }
    }
    如果applicationController{applicationController!.showWindow(发件人)}
    }
    var首选项控制器:NSWindowController?
    @iAction func showPreferences(发件人:AnyObject){
    如果!首选控制器{
    let storyboard=NSStoryboard(名称:“首选项”,捆绑:nil)
    preferencesController=storyboard.InstanceInitialController()作为?NSWindowController
    }
    如果preferencesController{preferencesController!.showWindow(发件人)}
    }
    }
    

    如果您只想在主窗口出现之前自定义主窗口的外观,那么这里有另一种既便宜又简单的方法:

    创建自己的NSWindowController子类,并将其连接为主窗口的代理

    将windowDidUpdate实现为窗口的挂钩,这样您就可以设置所需的选项,但也可以删除窗口委托,这样该函数只能调用一次。以下是实现该功能所需的全部代码:

    //  WindowController.swift
    
    import Cocoa
    
    class WindowController: NSWindowController, NSWindowDelegate {
    
        func windowDidUpdate(notification: NSNotification!) {
                if let window = notification.object as? NSWindow! {
                    window.titlebarAppearsTransparent = true
                    window.titleVisibility = NSWindowTitleVisibility.Hidden
                    window.styleMask |= NSFullSizeContentViewWindowMask
                    window.delegate = nil  }
        }
    }
    
    实际上,将这些外观选项应用于窗口的一种更简单的方法是使用Interface Builder将它们作为用户定义的运行时属性添加到NSWindow对象中。您根本不需要为NSWindowController创建子类或编写任何代码。只需通过Identity Inspector窗格将这些值插入窗口对象:

    Keypath: titlebarAppearsTransparent, Type: Boolean, Value: Checked
    Keypath: titleVisibility, Type: Number, Value: 1
    Keypath: styleMask, Type: Number, Value: 32783
    
    当然,您不能指定styleMask的各个位,但将它们全部相加并获得一个数字来指定样式是很容易的


    有了故事板体系结构和赋予NSViewController的新功能,就不需要再为NSWindowController子类化了。

    @elmercar在第3步:故事板上的“应用程序对象”在哪里?Document.swift控制WindowController和Window,以适应基于文档的应用程序体系结构(你创建了一个窗口公司