2016-12-04 60 views
0

我正在嘗試列出鑰匙串中的所有密鑰作爲NSMenuItems,當我單擊一個時,我希望它使用String參數調用一個函數,但每次使用當前代碼調用 當我運行我的應用程序時,鍵不僅會被點擊,而且會被移除。在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

目標/操作方法的簽名不帶任何參數或傳遞受影響的項目(本例中爲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()只有當鑰匙被刪除我猜。