MACOS 答题器,界面跳转

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

 

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

相关文章
相关标签/搜索