我明白以下內容將返回按下按鈕的標題。在Swift 3.0中,如何檢查按下哪個按鈕
let myString = sender.title(for: .normal)!
但我真的很想明白爲什麼這個工作。我無法在Apple documentation for UIButton中找到它。
我在另一個線程中看到sender
是Any
類型的參數而不是UIButton,但我希望在解碼這個語法時有任何幫助。
我明白以下內容將返回按下按鈕的標題。在Swift 3.0中,如何檢查按下哪個按鈕
let myString = sender.title(for: .normal)!
但我真的很想明白爲什麼這個工作。我無法在Apple documentation for UIButton中找到它。
我在另一個線程中看到sender
是Any
類型的參數而不是UIButton,但我希望在解碼這個語法時有任何幫助。
您可以在方法名稱中看到sender
的類型。您發佈的代碼只將發件人是否一個UIButton
在下面的工作,如:
@IBAction func sampleMethod(_ sender: UIButton) {
let myString = sender.title(for: .normal)
}
如果sender
是Any
型的,那麼你必須解開它作爲UIButton
爲了訪問標題以同樣的方式,像這樣:
@IBAction func sampleMethod(_ sender: Any) {
if let sender = sender as? UIButton {
let myString = sender.title(for: .normal)
}
}
如果你不這樣做,應用程序將無法編譯。類型Any
沒有title
屬性。
如果要創建通過從故事板代碼拖動IBAction
功能,默認是讓發件人類型是Any
,你可以在這裏看到:
你可以將其設置爲UIButton
使用下拉下一菜單類型,像這樣:
的目標,ACTI關於機制在UIControl
類的文檔中進行了說明,該類是可執行控件(如UIButton
)繼承的類。
從本質上講,動作功能必須實現以下籤名之一:
doSomething()
doSomething(_ sender: Any)
doSomething(_ sender: Any, event: UIEvent)
的sender
參數將是發送動作的控制。
Any
斯威夫特是一種特殊類型,它可以代表任何類型的,但它不是一個實際的類型,所以如果發件人是UIButton
然後sender
將是UIButton
一個實例,但不能訪問任何它的具體方法或屬性,除非你貶低它。你可以這樣說:
func doSomething(_ sender: Any) {
if let button = sender as? UIButton {
let myString = button(for: .normal)
}
一般來講,你知道你是如何連接的控制和操作處理程序,所以沒有必要垂頭喪氣的條件;你可以使用一個明確的垂頭喪氣:
func doSomething(_ sender: Any) {
let button = sender as! UIButton
let myString = button(for: .normal)
}
或者,更簡潔:
func doSomething(_ sender: UIButton) {
let myString = button(for: .normal)
}
現在,如果你錯誤地連接doSomething
到一個文本字段的動作,這後兩種形式會給你一個當downcast失敗時運行時崩潰;但希望在測試過程中能夠抓住這一點,所以通常認爲它是「安全的」。
guard let string = ((sender) as AnyObject).title(for: .normal)
else{
return
}
print(string)
這也可以工作。(如果你不知道發信人的類型)
但按鈕最常用的方式是
let string = (sender as! UIButton).title(for: .normal)
print(str!)
編譯器不會讓你在'AnyOnject'上調用'title(for:)'。 –
嘗試一次即可使用。 –
通常這個方法是由系統調用,該按鈕的實例作爲參數傳遞。這就是爲什麼在該方法中,你可以得到按鈕。 – jokeman