在不同的故事板上打开一个新的 window
Opening a new window on a different storyboard
我正在开发带有故事板的 OS X 应用程序。我在匿名 window 和自定义 ViewController 上获得了带有入口点的 Preview.storyboard。在 AppDelegate class 中,我得到以下函数。
func newPreviewWindow(sender: AnyObject) {
let storyboard = NSStoryboard.init(name: "Preview", bundle: nil)
let initialController = storyboard.instantiateInitialController()
initialController!.showWindow(nil)
initialController!.makeKeyAndOrderFront(nil)
}
当 运行 代码时,显示 window,但出现以下异常:
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
...
根据异常消息并在 Google 和 Whosebug 上搜索,我尝试以这种方式将选择器发送到 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)!'
打开新 window 或通过选择器的正确方法是什么?
谢谢! :)
initialController!.makeKeyAndOrderFront(nil)
导致问题,因为 makeKeyAndOrderFront:
不是 NSWindowController
方法 - 它属于 NSWindow
(因此 无法识别的选择器 错误)。将您的初始控制器投射到您的 NSWindowController
子类,然后通过控制器的 window
属性:
将 window 置于最前面
var windowController: NSWindowController!
@IBAction func showOtherWindow(sender: AnyObject) {
windowController = storyboard.instantiateInitialController() as! NSWindowController
windowController.window?.makeKeyAndOrderFront(nil)
}
我正在开发带有故事板的 OS X 应用程序。我在匿名 window 和自定义 ViewController 上获得了带有入口点的 Preview.storyboard。在 AppDelegate class 中,我得到以下函数。
func newPreviewWindow(sender: AnyObject) {
let storyboard = NSStoryboard.init(name: "Preview", bundle: nil)
let initialController = storyboard.instantiateInitialController()
initialController!.showWindow(nil)
initialController!.makeKeyAndOrderFront(nil)
}
当 运行 代码时,显示 window,但出现以下异常:
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
...
根据异常消息并在 Google 和 Whosebug 上搜索,我尝试以这种方式将选择器发送到 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)!'
打开新 window 或通过选择器的正确方法是什么?
谢谢! :)
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)
}