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个窗口)

 

demo:https://github.com/rayshen/TestingU

posted @ 2016-01-20 17:08  Rayshen  阅读(3194)  评论(2编辑  收藏  举报