OS X 10.11 上无法识别的选择器
Unrecognized selector on OS X 10.11
我在系统状态栏中使用带有菜单的自定义项来控制我的应用程序中的某些功能。这是我的代码:
import Foundation
class StatusBarMenuController {
var statusItem: NSStatusItem
init() {
self.statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
statusItem.image = NSImage(named: "StatusBarButtonImage")
let menu = NSMenu()
let isListeningMenuItem = NSMenuItem(title: "Listening", action: #selector(StatusBarMenuController.isListeningAction(_:)), keyEquivalent: "")
isListeningMenuItem.isAlternate = true
isListeningMenuItem.target = self
isListeningMenuItem.state = NSOnState
menu.addItem(isListeningMenuItem)
statusItem.menu = menu
}
@objc func isListeningAction(_ item: NSMenuItem) {
if (item.state == NSOffState) {
item.state = NSOnState
// Handle switch-on action...
}
else {
item.state = NSOffState
// Handle switch-off action...
}
}
}
这个class是在AppDelegate
的applicationDidFinishLaunching
方法中实例化的。
在最新版本的 macOS (10.12) 上一切正常 - 我在多台计算机上尝试过,但是当尝试在具有旧版本 os 的计算机上启动应用程序时,例如OS X 10.11,瞬间崩溃
崩溃详情:
Application Specific Information:
Unrecognized selector -[MyAppName.StatusBarMenuController methodForSelector:]
abort() called
知道为什么会这样吗?
源自 NSObject
解决了这个问题:
import Foundation
class StatusBarMenuController: NSObject {
var statusItem: NSStatusItem
override init() {
self.statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
super.init()
statusItem.image = NSImage(named: "StatusBarButtonImage")
let menu = NSMenu()
let isListeningMenuItem = NSMenuItem(title: "Listening", action: #selector(StatusBarMenuController.isListeningAction(_:)), keyEquivalent: "")
isListeningMenuItem.isAlternate = true
isListeningMenuItem.target = self
isListeningMenuItem.state = NSOnState
menu.addItem(isListeningMenuItem)
statusItem.menu = menu
}
@objc func isListeningAction(_ item: NSMenuItem) {
if (item.state == NSOffState) {
item.state = NSOnState
// Handle switch-on action...
}
else {
item.state = NSOffState
// Handle switch-off action...
}
}
}
这是一个非常奇怪的行为,因为在我应用程序的其他部分,我使用的选择器带有 NotificationCenter
而不是 NSObject-derived 类 并且它有效,例如:
class StatusBarMenuController {
NotificationCenter.default.addObserver(
self,
selector: #selector(handleMyNotification),
name: NSNotification.Name(rawValue: myNotification),
object: nil
)
@objc func handleMyNotifiction(_ notification: Notification) {
// ...
}
}
我在系统状态栏中使用带有菜单的自定义项来控制我的应用程序中的某些功能。这是我的代码:
import Foundation
class StatusBarMenuController {
var statusItem: NSStatusItem
init() {
self.statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
statusItem.image = NSImage(named: "StatusBarButtonImage")
let menu = NSMenu()
let isListeningMenuItem = NSMenuItem(title: "Listening", action: #selector(StatusBarMenuController.isListeningAction(_:)), keyEquivalent: "")
isListeningMenuItem.isAlternate = true
isListeningMenuItem.target = self
isListeningMenuItem.state = NSOnState
menu.addItem(isListeningMenuItem)
statusItem.menu = menu
}
@objc func isListeningAction(_ item: NSMenuItem) {
if (item.state == NSOffState) {
item.state = NSOnState
// Handle switch-on action...
}
else {
item.state = NSOffState
// Handle switch-off action...
}
}
}
这个class是在AppDelegate
的applicationDidFinishLaunching
方法中实例化的。
在最新版本的 macOS (10.12) 上一切正常 - 我在多台计算机上尝试过,但是当尝试在具有旧版本 os 的计算机上启动应用程序时,例如OS X 10.11,瞬间崩溃
崩溃详情:
Application Specific Information: Unrecognized selector -[MyAppName.StatusBarMenuController methodForSelector:]
abort() called
知道为什么会这样吗?
源自 NSObject
解决了这个问题:
import Foundation
class StatusBarMenuController: NSObject {
var statusItem: NSStatusItem
override init() {
self.statusItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)
super.init()
statusItem.image = NSImage(named: "StatusBarButtonImage")
let menu = NSMenu()
let isListeningMenuItem = NSMenuItem(title: "Listening", action: #selector(StatusBarMenuController.isListeningAction(_:)), keyEquivalent: "")
isListeningMenuItem.isAlternate = true
isListeningMenuItem.target = self
isListeningMenuItem.state = NSOnState
menu.addItem(isListeningMenuItem)
statusItem.menu = menu
}
@objc func isListeningAction(_ item: NSMenuItem) {
if (item.state == NSOffState) {
item.state = NSOnState
// Handle switch-on action...
}
else {
item.state = NSOffState
// Handle switch-off action...
}
}
}
这是一个非常奇怪的行为,因为在我应用程序的其他部分,我使用的选择器带有 NotificationCenter
而不是 NSObject-derived 类 并且它有效,例如:
class StatusBarMenuController {
NotificationCenter.default.addObserver(
self,
selector: #selector(handleMyNotification),
name: NSNotification.Name(rawValue: myNotification),
object: nil
)
@objc func handleMyNotifiction(_ notification: Notification) {
// ...
}
}