2016-12-04 15 views
0

現在、キーチェーン内のすべてのキーをNSMenuItemsとして表示しようとしています。クリックすると、文字列パラメータを持つ関数を呼び出せます。 私はキーをクリックするだけでなく、私のアプリを実行すると、キーが削除されます。Swift + NSMenuItemのパラメータを持つセレクタ()

これは私の現在のコードです:

class AppDelegate: NSObject, NSApplicationDelegate { 

    let menu = NSMenu() 
    let internetKeychain = Keychain(server: "example.com", protocolType: .https, authenticationType: .htmlForm) 

    func applicationDidFinishLaunching(_ aNotification: Notification) { 
    for key in internetKeychain.allKeys() { 
     menu.addItem(NSMenuItem(title: " \(key)", action: Selector(deleteKey(key: "\(key)")), keyEquivalent: "")); 
    } 

    if let button = statusItem.button { 
     button.title = "" 
     button.target = self } 
     statusItem.menu = menu 
     NSApp.activate(ignoringOtherApps: true) 
    } 

    func deleteKey(key: String) -> String { 
    do { 
     try addInternetPasswordVC().internetKeychain.remove("\(key)") 
     print("key: \(key) has been removed") 
    } catch let error { 
     print("error: \(error)") } 
    refreshMenu() 
    return key 
    } 

... 
} 

私は

を疑う

NSApplicationMain

  • オプション1:セレクタは(または単にある程度で)パラメータを持つ関数
  • オプション2を受け入れます:最初の行または最後の行の関数を少し間違えました。

答えて

0

ターゲット/アクションメソッドのシグネチャは、パラメータを持たないか、影響を受けるアイテム(この場合はNSMenuItemインスタンス)を渡します。何かを返すことはできません。

menu.addItem(NSMenuItem(title: " \(key)", action: #selector(deleteKey(_:)), keyEquivalent: "")); 

... 

func deleteKey(_ sender: NSMenuItem) { 
    do { 
     let key = sender.title.substring(from: sender.title.range(of: " ")!.upperBound) 
     try addInternetPasswordVC().internetKeychain.remove("\(key)") 
     print("key: \(key) has been removed") 
     refreshMenu() 
    } catch let error { 
     print("error: \(error)") 
    } 
} 

PS:refreshMenu()は、キーが取り外されたときにのみ便利です。

関連する問題