2017-04-08 117 views
1

我試圖通過UIBarButtonItem作爲參數, 但我得到以下錯誤:如何傳遞參數給法「#selector」

Argument of '#selector' does not refer to an '@objc' method, property, or initializer

@objc func barClicked(sender: AnyObject) { 

} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    let bar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 50)) 
    bar.barStyle = UIBarStyle.default 
    bar.items = [ 
     UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), 
     UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(barClicked(sender: bar.items[0])))] 
    bar.sizeToFit() 
} 

也試過#selector(barClicked(sender: bar.items[0] as AnyObject

謝謝

+3

請看看「相關」部分,這已經被反覆詢問和回答。你*不能*在選擇器中傳遞參數。 –

+1

僅供參考 - 該按鈕將是參數。你不需要自己指定它。 – rmaddy

+0

@MartinR謝謝,是否有其他解決方案? –

回答

2

永遠不會有將參數傳遞給您在使用時所指的方法文字。參數將由選擇器的執行者傳遞給方法,在這種情況下,這是UIBarButtonItem的內部工作方式。

爲了解決這個問題,只需刪除參數列表:

#selector(barClicked) 

當進行選擇時,sender參數將最有可能保持在工具欄上的第二UIBarButtonItem一個參考,因爲你設置選擇action作爲第二個UIBarButtonItem

但是,t似乎是你故意希望發件人成爲工具欄的第一個UIBarButtonItem。這聽起來很不直觀。你可能在這裏做錯了什麼。但是,如果你堅持要通過工具欄的第一個項目,這樣做:

// add a new method like this: 
func someMethod() { // name this properly! 
    barClicked(sender: bar.items[0]) // please make bar a class-level variable first. 
} 

那麼你可以參考someMethod#selector

#selector(someMethod)