2017-07-28 69 views
1

我明白以下內容將返回按下按鈕的標題。在Swift 3.0中,如何檢查按下哪個按鈕

let myString = sender.title(for: .normal)! 

但我真的很想明白爲什麼這個工作。我無法在Apple documentation for UIButton中找到它。

我在另一個線程中看到senderAny類型的參數而不是UIButton,但我希望在解碼這個語法時有任何幫助。

+0

通常這個方法是由系統調用,該按鈕的實例作爲參數傳遞。這就是爲什麼在該方法中,你可以得到按鈕。 – jokeman

回答

3

您可以在方法名稱中看到sender的類型。您發佈的代碼只將發件人是否一個UIButton在下面的工作,如:

@IBAction func sampleMethod(_ sender: UIButton) { 
    let myString = sender.title(for: .normal) 
} 

如果senderAny型的,那麼你必須解開它作爲UIButton爲了訪問標題以同樣的方式,像這樣:

@IBAction func sampleMethod(_ sender: Any) { 
    if let sender = sender as? UIButton { 
     let myString = sender.title(for: .normal) 
    } 
} 

如果你不這樣做,應用程序將無法編譯。類型Any沒有title屬性。

如果要創建通過從故事板代碼拖動IBAction功能,默認是讓發件人類型是Any,你可以在這裏看到:

enter image description here

你可以將其設置爲UIButton使用下拉下一菜單類型,像這樣:

enter image description here

1

目標,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失敗時運行時崩潰;但希望在測試過程中能夠抓住這一點,所以通常認爲它是「安全的」。

-1
guard let string = ((sender) as AnyObject).title(for: .normal) 
    else{ 
     return 
    } 
    print(string) 

這也可以工作。(如果你不知道發信人的類型)

但按鈕最常用的方式是

let string = (sender as! UIButton).title(for: .normal) 
print(str!) 
+0

編譯器不會讓你在'AnyOnject'上調用'title(for:)'。 –

+0

嘗試一次即可使用。 –