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