《從零開始學Swift》學習筆記(Day 65)——Cocoa Touch設計模式及應用之選擇器

原創文章,歡迎轉載。轉載請註明:關東昇的博客php

 實現目標與動做關聯使用UIControl類addTarget(_:action:forControlEvents:)方法,示例代碼以下:微信

button.addTarget(self, action: "onClick:",

           forControlEvents: UIControlEvents.TouchUpInside)

其中的action參數"onClick:"事實上就是選擇器(Selector)。 ide

問題提出函數

任何可以將方法調用的綁定推遲到運行期,在編譯時方法調用者不須要知道要調用的方法是什麼,這個能夠下降調用者與被調用者之間的耦合度,這樣就語言就很靈活。在C語言在提供一種函數指針技術,Objective-C和Swift語言都提供選擇器(Selector)類型,它是C語言函數指針的面向對象替代技術。網站

選擇器在Cocoa和Cocoa Touch中的目標動做、通知和委託等模式中方法的調用實現的關鍵。 spa

解決方案設計

Objective-C中選擇器是SEL數據類型,使用@selector()語句調用,調用onClick:方法的Objective-C示例代碼以下:指針

SEL selector = @selector(onClick:);

[button addTarget:self action: selector

         forControlEvents: UIControlEventTouchUpInside];

Swift中雖然沒有提供SEL數據類型,而是提供了Selector結構體,經過方法名字符串構建Selector實例,示例代碼以下:code

button.addTarget(self, action: Selector("onClick:"),

          forControlEvents: UIControlEvents.TouchUpInside)


經過選擇器調用方法,關鍵是方法名字,它有必定規律的。窮其根本是源自於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

相關文章
相關標籤/搜索