2016-08-11 40 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背景,我已经掌握了两个我还没有理解的重要概念!非常感谢!! –