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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM