國內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個窗口)