你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 《從零開始學Swift》學習筆記(Day 65)——Cocoa Touch設計模式及應用之選擇器

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

編輯:IOS開發綜合

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

    

button.addTarget(self,action: "onClick:", 
            forControlEvents: UIControlEvents.TouchUpInside)

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

  問題提出

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

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

  解決方案

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

    

SEL selector = @selector(onClick:);
[button addTarget:selfaction: selector
          forControlEvents:UIControlEventTouchUpInside];

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

    

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

  通過選擇器調用方法,關鍵是方法名字,它有一定規律的。窮其根本是源自於Objective-C多重參數方法命名規律。方法名的冒號暗示了方法名應該具有幾個參數,下面我們看幾個示例:

//選擇器為"onClick:"
    func onClick(sender: AnyObject) {
        NSLog("onClick:")
    }
     
    //選擇器為"onClick:forEvent:"
    func onClick(sender: AnyObject, forEventevent: 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 sentto instance 0x7f7f81499b10'

  這個錯誤的意思是沒有找到選擇器所指定的方法,也就是沒有找到onClick:方法。正確的做法是在方法前面添加@objc屬性注釋,這說明選擇器是在objc runtime運行環境下調用的。

  

//選擇器為"onClick:"
    @objc private func onClick(sender:AnyObject) {
        NSLog("onClick:")
    }

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved