2016-12-04 14 views
0

В настоящее время я пытаюсь перечислить все ключи в цепочке ключей как NSMenuItems, и когда я нажимаю один, я хочу, чтобы он вызывал функцию с параметром String BUT с моим текущим кодом каждый ключ удаляется, когда я запускаю свое приложение не только нажатием клавиши.Селектор() с параметром в Swift + NSMenuItem

Это мой текущий код:

NSApplicationMain

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 
    } 

... 
} 

Я подозреваю

  • Вариант 1: селекторы принимают функции с параметрами (или просто в какой-то степени)
  • Вариант 2 : Я сделал небольшую ошибку в функции в первой или последней строке.

ответ

0

Подпись метода target/action не принимает ни параметра, ни пропускает затронутый элемент (в данном случае пример 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() полезна только тогда, когда ключ вынут я думаю.