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

相關文章
相關標籤/搜索