實現目標與動做關聯使用UIControl類addTarget(_:action:forControlEvents:)方法,演示樣例代碼例如如下:php
button.addTarget(self, action: "onClick:", forControlEvents: UIControlEvents.TouchUpInside)
當中的action參數"onClick:"其實就是選擇器(Selector)。html
問題提出微信
不論什麼能夠將方法調用的綁定推遲到執行期,在編譯時方法調用者不需要知道要調用的方法是什麼。這個能夠減小調用者與被調用者之間的耦合度,這樣就語言就很是靈活。ide
在C語言在提供一種函數指針技術。Objective-C和Swift語言都提供選擇器(Selector)類型。它是C語言函數指針的面向對象替代技術。函數
選擇器在Cocoa和Cocoa Touch中的目標動做、通知和託付等模式中方法的調用實現的關鍵。 post
解決方式url
Objective-C中選擇器是SEL數據類型,使用@selector()語句調用,調用onClick:方法的Objective-C演示樣例代碼例如如下:spa
SEL selector = @selector(onClick:); [button addTarget:self action: selector forControlEvents: UIControlEventTouchUpInside];
Swift中儘管沒有提供SEL數據類型,而是提供了Selector結構體,經過方法名字符串構建Selector實例,演示樣例代碼例如如下:設計
button.addTarget(self, action: Selector("onClick:"), forControlEvents: UIControlEvents.TouchUpInside)
經過選擇器調用方法,關鍵是方法名字,它有必定規律的。3d
窮其根本是源自於Objective-C多重參數方法命名規律。方法名的冒號暗示了方法名應該具備幾個參數,如下咱們看幾個演示樣例:
//選擇器爲"onClick:" func onClick(sender: AnyObject) { NSLog("onClick:") } //選擇器爲"onClick:forEvent:" func onClick(sender: AnyObject, forEvent event: UIEvent) { NSLog("onClick:forEvent:") } //選擇器爲"onClickWithExtSender:forEvent:" func onClick(extSender sender: AnyObject, forEvent event: UIEvent) { NSLog("onClickWithExtSender:forEvent:") }
出於數據封裝的需要,咱們會在方法前面加private,使其變爲私有方法,代碼例如如下。
private func onClick(sender: AnyObject) { NSLog("onClick:") }
unrecognized selector sent to instance 0x7f7f81499b10'
這個錯誤的意思是沒有找到選擇器所指定的方法,也就是沒有找到onClick:方法。正確的作法是在方法前面加入@objc屬性凝視。這說明選擇器是在objc runtime執行環境下調用的。
//選擇器爲"onClick:" @objc private func onClick(sender: AnyObject) { NSLog("onClick:") }
歡迎關注關東昇新浪微博@tony_關東昇。
關注智捷課堂微信公共平臺。瞭解最新技術文章、圖書、教程信息
不少其它精品iOS、Cocos、移動設計課程請關注智捷課堂官方站點:http://www.zhijieketang.com
智捷課堂論壇站點:http://51work6.com/forum.php