import Cocoa@NSApplicationMainclass AppDelegate: NSObject,NSApplicationDelegate { @IBOutlet weak var window: NSWindow!}
The @NSApplicationMain
attribute is documented here作为
NSApplicationMain
Apply this attribute to a class to indicate that it is the application delegate. Using this attribute is equivalent to calling the
NSApplicationMain(_:_:)
function.If you do not use this attribute,supply a
main.swift
file with code at the top level that calls theNSApplicationMain(_:_:)
function as follows:06001
文档中的说明不起作用:AppDelegate类从未实例化.在this answer,vadian中建议main.swift的以下内容,它比文档中的代码更好用:
import Cocoalet appDelegate = AppDelegate()NSApplication.shared().delegate = appDelegate_ = NSApplicationMain(Commandline.argc,Commandline.unsafeArgv)
但是,这仍然不会提供与@NSApplicationMain相同的行为.考虑使用上面的main.swift和以下AppDelegate.swift:
import Cocoaclass AppDelegate: NSObject,NSApplicationDelegate { @IBOutlet weak var window: NSWindow! var foo: Nsstatusbar! = Nsstatusbar.system();}
上面的AppDelegate.swift使用@NSApplicationMain注释,但是当使用上面的main.swift时,它在运行时因错误而失败
Assertion Failed: (CGAtomicGet(&is_initialized)),function CGSConnectionByID,file Services/Connection/CGSConnection.c,line 127.
我认为这个is_initialized错误意味着@NSApplicationMain设置了一些内容,以便在NSApplicationMain函数进行一些初始化之后实例化AppDelegate.这表明以下main.swift,它将委托初始化移动到NSApplicationMain调用之后:
import Cocoa_ = NSApplicationMain(Commandline.argc,Commandline.unsafeArgv)let appDelegate = AppDelegate()NSApplication.shared().delegate = appDelegate
但是,这也不起作用,因为NSApplicationMain永远不会返回!上面的main.swift等同于文档中的破坏建议,因为后两行是死代码.
因此,我认为必须有一些方法可以将对AppDelegate类的引用作为NSApplicationMain函数的参数传递,以便Cocoa可以进行初始化,然后实例化我的AppDelegate类本身.但是,我认为没办法这样做.
是否有一个main.swift提供的行为真正等同于@NSApplicationMain注释?如果是这样,那main.swift是什么样的?如果没有,@ NSApplicationMain实际上在做什么,以及如何修改它?
解决方法 该文档假定有一个xib或storyboard通过Interface Builder中的对象(蓝色多维数据集)实例化AppDelegate类.在这种情况下两者> main.swift包含NSApplicationMain(Commandline.argc,Commandline.unsafeArgv)
和
> AppDelegate类中的@NSApplicationMain
表现完全一样.
如果没有xib或storyboard,则负责初始化AppDelegate类,将其分配给NSApp.shared().委托并运行应用程序.您还必须考虑对象的外观顺序.例如,在调用NSApp.shared()以启动应用程序之前,无法初始化与AppKit相关的对象.
例如,这种略微改变的语法
let app = NSApplication.shared()let appDelegate = AppDelegate()app.delegate = appDelegate_ = NSApplicationMain(Commandline.argc,Commandline.unsafeArgv)
你可以在应用程序之外的AppDelegate中初始化状态栏DIDFinishLaunching:
let statusItem = Nsstatusbar.system().statusItem(withLength: -1)
因为在初始化AppDelegate类之前调用了启动应用程序的NSApplication.shared().
总结以上是内存溢出为你收集整理的是否有一个main.swift等同于@NSApplicationMain注释?全部内容,希望文章能够帮你解决是否有一个main.swift等同于@NSApplicationMain注释?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)