Swift和iOS開發中的超級newb在這裏。當添加UIButton目標時,「classname has no member functionname」
我正在關注在單個視圖iOS應用中實現自定義控件的this tutorial。這是一個Swift 2教程,但到目前爲止,我一直在努力將所有內容都轉換爲3(我使用XCode 8 Beta)。
我有一個自定義類,RatingControl
,連接到故事板中的View
。
在類的構造函數中,我創建了一個按鈕:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
button.backgroundColor = UIColor.red()
於是,我試圖給該按鈕的動作。該教程說我應該做它像這樣:
button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)),
for: .touchDown)
,然後創建,在同RatingControl
類,方法:
func ratingButtonTapped(button: UIButton) {
print("Button pressed ")
}
但是當我編譯,它抱怨:
類型「RatingControl」沒有任何成員「ratingButtonTapped」
我已經100%確定函數在那裏,在課堂上,並且正確命名。 Full source
有什麼明顯的我失蹤了嗎?
我的嘗試:
新增
@objc
類定義爲每this answer(但似乎對於斯威夫特唯一怪異,不是嗎?)製造
ratingButtonTapped()
明確public
(但看起來應該是不必要的)擺弄字符串而不是選擇器s,
button.addTarget(self, action: "RatingControl.ratingButtonTapped", for: .touchDown)
等等,但是之後就會崩潰。
A-ha! XCode的自動提示功能回答了這個問題:我現在需要使用'RatingControl.ratingButtonTapped',沒有括號。這工作正常,現在編譯。我可以刪除這個問題 - 但如果有人想提供一個答案更詳細地解釋這個問題,以及*爲什麼會發生這種情況,我們可能能夠爲未來具有相同問題的讀者提供一個有用的資源? –
我認爲這個問題很好,只要它標記爲'swift3',因爲一旦Swift 3成爲標準,這可能會導致一些混淆。關於選擇器的一個提示是:如果方法與調用者在同一個範圍內,你可以調用'self.methodName'而不是'ClassName.methodName',這只是一個美觀的細節。 – xoudini
@xoudini謝謝! –