2017-01-09 12 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... 
     } 
    } 
} 

このクラスはAppDelegateapplicationDidFinishLaunching方法でインスタンス化されます。

すべてが最新のMacOS(10.12)でうまく動作します - 私は複数のコンピュータで試しましたが、古いバージョンのosを持つマシンでアプリケーションを起動しようとすると、 OS X 10.11、それはすぐにクラッシュします。

クラッシュの詳細:

アプリケーション固有の情報: 認識されていないセレクタ - [MyAppName.StatusBarMenuController methodForSelector:]

アボートは()

任意のアイデアを呼ばなぜこの出来事はありますか? NSObjectから派生

答えて

0

は、この問題を解決:

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... 
     } 
    } 
} 

私のアプリの他の部分で、私はいないNSObjectの派生クラスでNotificationCenterでセレクタを使用していますし、それが動作、例えばので、それは非常に奇妙な行動です。

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

    @objc func handleMyNotifiction(_ notification: Notification) { 
     // ... 
    } 
} 
関連する問題