2016-08-11 41 views
1

我正在開發一個帶故事板的OS X應用程序。我在具有自定義ViewController的匿名窗口上看到帶有入口點的Preview.storyboard。在AppDelegate類中,我得到以下函數。在另一個故事板上打開一個新窗口

func newPreviewWindow(sender: AnyObject) { 
    let storyboard = NSStoryboard.init(name: "Preview", bundle: nil) 
    let initialController = storyboard.instantiateInitialController() 
    initialController!.showWindow(nil) 
    initialController!.makeKeyAndOrderFront(nil) 
} 

運行代碼時,窗口顯示,但我得到以下異常:基於異常消息

2016-08-11 10:27:12.434 MyApp[1090:290439] -[NSWindowController makeKeyAndOrderFront:]: unrecognized selector sent to instance 0x60000008c350 
2016-08-11 10:27:12.434 MyApp[1090:290439] -[NSWindowController makeKeyAndOrderFront:]: unrecognized selector sent to instance 0x60000008c350 
2016-08-11 10:27:12.440 MyApp[1090:290439] (
    0 CoreFoundation    0x00007fff926284f2 __exceptionPreprocess + 178 
    1 libobjc.A.dylib   0x00007fff97c0ef7e objc_exception_throw + 48 
    2 CoreFoundation    0x00007fff926921ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation    0x00007fff92598571 ___forwarding___ + 1009 
    4 CoreFoundation    0x00007fff925980f8 _CF_forwarding_prep_0 + 120 
    5 MyApp      0x0000000100005617 
... 

,並在谷歌和StackOverflow上搜索,我試圖發送一個選擇的makeKeyAndOrderFront功能是這樣的:

func newPreviewWindow(sender: AnyObject) { 
    let storyboard = NSStoryboard.init(name: "Preview", bundle: nil) 
    let initialController = storyboard.instantiateInitialController() 
    let selector = #selector(AppDelegate.newPreviewWindow(_:)) 
    initialController!.showWindow(nil) 
    initialController!.makeKeyAndOrderFront(selector) // [A] 
} 

但後來我得到的線[A]以下編譯錯誤:Cannot call value of non-function type '((AnyObject?) -> Void)!'

如何正確打開新窗口或傳遞選擇器?

謝謝! :)

回答

1

initialController!.makeKeyAndOrderFront(nil)引起一個問題,因爲makeKeyAndOrderFront:不是NSWindowController方法 - 它屬於NSWindow(因此無法識別選擇錯誤)。投下你最初的控制器到您NSWindowController子類,則通過控制器的window財產帶來的窗口前:

var windowController: NSWindowController! 

@IBAction func showOtherWindow(sender: AnyObject) { 
    windowController = storyboard.instantiateInitialController() as! NSWindowController 
    windowController.window?.makeKeyAndOrderFront(nil) 
} 
+0

非常感謝!它似乎修復了異常和編譯錯誤。不幸的是,這個窗口根本沒有顯示出來(奇怪的是,當'initialController!.makeKeyAndOrderFront(nil)'拋出異常時它是如何出現的)。我同時執行'windowController.showWindow(nil)'和'windowController.window!.makeKeyAndOrderFront(nil)',並且沒有任何反應。你會碰巧有一個想法,爲什麼? –

+2

在您發佈的代碼中,initialController是一個局部變量。像任何其他局部變量一樣,只要創建它的函數退出,它就會丟失(與窗口一起)。換句話說,窗口**不會出現,但只有在函數執行之前纔會出現。這發生得很快,看起來沒有任何反應。在崩潰的代碼中,崩潰可能會導致暫停或凍結函數的執行。因此該函數永遠不會返回,並且窗口控制器停留在屏幕上以保持窗口。解決方案是將控制器分配給一個屬性。 –

+0

哦,我明白了!它現在完美運行,並且由於我的java背景,我已經掌握了兩個我還沒有理解的重要概念!非常感謝!! –