使用Xcode 6中的故事板的Cocoa应用程序的AppDelegate
我有一个现有的OSX应用程序,在转换成故事板作为主界面后,我的应用程序委托不再被使用。以前,main menu.xib有一个“App Delegate”对象,我可以将其类设置为我的App Delegate。但是,故事板不包含此类对象使用Xcode 6中的故事板的Cocoa应用程序的AppDelegate,cocoa,xcode6,Cocoa,Xcode6,我有一个现有的OSX应用程序,在转换成故事板作为主界面后,我的应用程序委托不再被使用。以前,main menu.xib有一个“App Delegate”对象,我可以将其类设置为我的App Delegate。但是,故事板不包含此类对象 如何取回AppDelegate并保留情节提要?我觉得我遗漏了一些明显的东西。如果您不将其指定为基于文档的应用程序,Xcode将创建一个AppDelegate.swift类,并在应用程序场景中为您连接它 截至目前(Xcode Beta-2),新的基于文档的应用程序不附
如何取回AppDelegate并保留情节提要?我觉得我遗漏了一些明显的东西。如果您不将其指定为基于文档的应用程序,Xcode将创建一个AppDelegate.swift类,并在应用程序场景中为您连接它 截至目前(Xcode Beta-2),新的基于文档的应用程序不附带存根AppDelegate.swift文件。取而代之的是ViewController.swift和Document.swift。更糟糕的是,Document.swift文件错误地为文档实例化了相同的Main.storyboard 我有一个办法让它发挥作用:
// 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,以适应基于文档的应用程序体系结构(你创建了一个窗口公司