2017-07-21 48 views
2

我希望父母ViewController能夠處理其子帳號ViewControllers之一生成的目標操作。addTarget:action:forControlEvents:目標爲nil時的選擇器語法?

根據Apple文檔,應該可以通過將target設置爲nil並遵循Responder鏈來實現。

如果指定零爲目標對象時,控制搜索 響應鏈爲定義指定操作 方法的對象。 https://developer.apple.com/documentation/uikit/uicontrol

但我怎麼寫的操作方法簽名時targetnil

通常,您可以將函數名稱放在#selector()中,這樣可以讓您編譯時檢查該簽名是否存在方法。像這樣:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     self.button.addTarget(self, action: #selector(buttonPressed(sender:)), for: .touchDown) 
    } 

    func buttonPressed(sender: UIButton) { } 

} 

但由於targetnil編譯器會抱怨,因爲它無法找到它:

// ! Use of unresolved identifier "buttonPressed(sender:)" 
button.addTarget(nil, action: #selector(buttonPressed(sender:)), for: .touchDown) 

我試圖用一個字符串初始化一個選擇,但是編譯器也抱怨。

// ! String literal is not a valid Objective-C selector 
    button.addTarget(nil, action: Selector("buttonPressed(sender:)"), for: .touchDown) 

回答

3

解決方案是以定義類的名稱作爲前綴。

button.addTarget(nil, action: #selector(MyViewController.buttonPressed(sender:)), for: .touchDown) 

FYI我通過this nice blog post from Jan 2016得到了答案,下載源文件,並且具有的XCode將其轉換爲斯威夫特3語法:-)

+0

但這無疑違背了一點:一個響應者可以到選擇響應沒有明確地預先定義響應者.. – Aodh

+0

你是什麼意思?因爲現在選擇器必須是'MyViewController'中定義的方法?我希望我的孩子的行爲由其父母處理,所以我希望我的選擇器在父母中定義。 – MH175

+0

響應者鏈機制的想法是響應者是可能響應者鏈中的第一個,沒有明確命名響應者將響應,允許鬆散耦合。 – Aodh