国内OSX开发的资料实在少,甚至连一本开发的书都找不到…git
更无语的是,苹果自家的开发文档Sample Code不只还停留在OC版本,仍是MRC的…github
在这样的状况下,OSX开发还真得靠“想象力”…oop
网上有Demo关于随机数,取色器等,基本就是一个Class就能搞定的。动画
好比https://github.com/fancymax/Cocoa-Learning这里面的几个demo都是相似的实现单界面的某个小功能。spa
这篇博客分享下我关于窗口跳转的心得。3d
1.首先必需要明确的关系:NSWindowController,NSWindow,NSViewController,NSViewcode
在iOS里,只有一个Window,但OSX里有多个Window,因此增长了NSWindowController。对象
从范围上来说,NSWindowController>NSWindow>NSViewController>NSViewblog
稍微专业一点的关系图:事件
2.如何建立一个Window:
Window通常都依附于WindowController,因此须要建立Window,若是不借助于Storyboard的话,须要建立一个WindowController,代码以下:
下面这个例子模拟点击一个按钮,建立新的窗口。(假如把代码写在APPdelegate里,就会在启动时自动新建这个窗口)
这里有个很是大的坑,我被坑了好久,看似同样的代码,但局部变量建立的WindowController对象是就是显示不出Window的。谁知道能够给我科普下…
var settingWinC:SettingWindowController? @IBAction func settingButtonClick(sender: AnyObject) { //新建窗口 settingWinC=SettingWindowController() settingWinC!.showWindow(nil); //用局部变量是没法显示窗口的!!!至于为何!!可能和对象的内存管理有关! // var settingWC=SettingWindowController() // settingWC.showWindow(nil); }
3.如何在某个Window内进行View的跳转?(假如在ViewController中,你得先取得当前的Window)
(方法1)赋值给ContentView
由于每个Window都会有一个ContentView,因此个人作法是直接把你准备好的View直接赋值给ContentView。
假如你的View来自某个其余的ViewController,这里就会有个须要注意的坑。和上面同样,假如你的是临时变量,这个ViewController中的Button的响应事件是会崩溃的…
你能够这样来替换contentView
var testVC:TestingViewController?
@IBAction func startButtonClick(sender: AnyObject) {
testVC=TestingViewController() self.view.window?.contentView=testVC!.view }
或者,你须要把这个ViewController加入到这个Window的.contentViewController?.addChildViewController里。
这个可能和event loop机制有关吧。
let testVC=TestingViewController() //同一个Window内,直接替换contentView显示 //必需要把下一个ViewController先加到window的contentViewController里,不然其上的按钮事件都会报错 self.view.window?.contentViewController?.addChildViewController(testVC) self.view.window?.contentView=testVC.view
(方法2)覆盖到ContentView
也能够用contentView.addSubview()的方式在其上添加其余View。
总的来讲,这部分跳转都是须要手动控制View的,并无一些如NavigationController之类的让你Push和Pop。
4.如何在ViewController中,以新Window的方式显示某个View?
present就是能以新Window显示View的,它的效果以下
var testVC:TestingViewController? @IBAction func startButtonClick(sender: AnyObject) { testVC=TestingViewController() self.presentViewControllerAsModalWindow(testVC!) }
presentViewControllerAsModalWindow:
presentViewControllerAsSheet:(动画效果从上到下下拉出来,这里有2个窗口)