4

Swiftでシンプルな1つのファイルメニューバーアプリを持っています:

import Cocoa

class StatusBarApp : NSObject {

  func buildMenu() {
    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)
    statusItem.title = "StatusBarApp"

    let menu = NSMenu()

    let aboutMenuItem = NSMenuItem()
    aboutMenuItem.title = "About"
    aboutMenuItem.target = self
    aboutMenuItem.action = #selector(about)
    menu.addItem(aboutMenuItem)

    statusItem.menu = menu
  }

  func about() {
    print("XXX")
  }
}

NSApplication.sharedApplication()
StatusBarApp().buildMenu()
NSApp.run()

「About」メニュー バー項目を about() 関数に接続することができません。アプリを実行すると、「About」項目が無効になります。

Swift 2.2でセレクターをメニュー項目アクションに渡すにはどうすればよいですか? ありがとう

4

3 に答える 3

0

NSMenuItemセレクターにはパラメーター (インスタンス)があるはずです

aboutMenuItem.action = #selector(StatusBarApp.about(_:))

...

func about(sender : NSMenuItem) {
   print("XXX")
}

編集:

解決策は、デリゲートを含む完全な Cocoa アプリとしてアプリを実行することです。
アプリを終了するための 2 つ目のメニュー項目を追加しました。

import Cocoa

class StatusBarApp : NSObject, NSApplicationDelegate {

  var statusItem : NSStatusItem!

  func applicationDidFinishLaunching(aNotification: NSNotification) {
    statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)
    statusItem.title = "StatusBarApp"

    let menu = NSMenu()

    let aboutMenuItem = NSMenuItem(title:"About", action:#selector(StatusBarApp.about(_:)), keyEquivalent:"")
    aboutMenuItem.target = self
    let quitMenuItem = NSMenuItem(title:"Quit", action:#selector(StatusBarApp.quit(_:)), keyEquivalent:"")
    quitMenuItem.target = self
    menu.addItem(aboutMenuItem)
    menu.addItem(quitMenuItem)

    statusItem.menu = menu
  }

  func about(sender : NSMenuItem) {
    print("XXX")
  }

  func quit(sender : NSMenuItem) {
    NSApp.terminate(self)
  }
}

NSApplication.sharedApplication()
let statusBarApp = StatusBarApp()
NSApp.delegate = statusBarApp
NSApp.run()
于 2016-04-19T12:26:34.237 に答える
0

このことを考慮:

import Cocoa

class StatusBarApp : NSObject {

    func buildMenu() {
        let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)
        statusItem.title = "StatusBarApp"

        let menu = NSMenu()

        let aboutMenuItem = NSMenuItem()
        aboutMenuItem.title = "About"
        aboutMenuItem.target = self
        aboutMenuItem.action = #selector(about)
        menu.addItem(aboutMenuItem)

        statusItem.menu = menu
    }

    func about() {
        print("XXX")
    }
}


let app = StatusBarApp()
NSApplication.sharedApplication()
app.buildMenu()
NSApp.run()
于 2016-04-19T12:22:11.147 に答える