2017-01-09 3 views
1

Я использую настраиваемый элемент с меню в строке состояния системы для управления некоторыми функциями в моем приложении. Вот мой код:Нераспознанный селектор в 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... 
     } 
    } 
} 

Этот класс конкретизируется в applicationDidFinishLaunching методе AppDelegate.

Все работает нормально в последней версии macOS (10.12). Я пробовал его на нескольких компьютерах, но при попытке запустить приложение на машине со старой версией os, например. OS X 10.11, он мгновенно падает.

Краш детали:

Application Specific Информация: Непризнанный селектор - [MyAppName.StatusBarMenuController methodForSelector:]

прерывания() называется

Любые идеи, почему это происходит?

ответ

0

Выведение из 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-производных классов и она работает, например:

class StatusBarMenuController { 
    NotificationCenter.default.addObserver(
     self, 
     selector: #selector(handleMyNotification), 
     name: NSNotification.Name(rawValue: myNotification), 
     object: nil 
    ) 

    @objc func handleMyNotifiction(_ notification: Notification) { 
     // ... 
    } 
} 
Смежные вопросы