MACOS 答题器,界面跳转
国内OSX开发的资料实在少,甚至连一本开发的书都找不到…
更无语的是,苹果自家的开发文档Sample Code不仅还停留在OC版本,还是MRC的…
在这样的情况下,OSX开发还真得靠“想象力”…
网上有Demo关于随机数,取色器等,基本就是一个Class就能搞定的。
比如https://github.com/fancymax/Cocoa-Learning这里面的几个demo都是类似的实现单界面的某个小功能。
这篇博客分享下我关于窗口跳转的心得。
1.首先必须要明确的关系:NSWindowController,NSWindow,NSViewController,NSView
在iOS里,只有一个Window,但OSX里有多个Window,所以增加了NSWindowController。
从范围上来讲,NSWindowController>NSWindow>NSViewController>NSView
稍微专业一点的关系图:
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个窗口)
___________________________________________________
专注iOS/前端开发,广泛涉猎多种平台和技术,欢迎交流
可以在微博关注并@沈z伟