《從零開始學Swift》學習筆記(Day 64)——Cocoa Touch設計模式及應用之目標與動做

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

 

目標(Target)與動做(Action)是iOS和OS X應用開發的中事件處理機制。編程

 

問題提出swift

如圖所示是一個ButtonLabelSample案例設計原型圖,其中包含一個標籤和一個按鈕,當點擊按鈕的時候,標籤文本會從初始的Label替換爲HelloWorld。微信

                       

 

ButtonLabelSample案例首先要解決的問題是:按鈕點擊事件後有誰負責響應事件?誰進行事件處理?要答這個問題,能夠打開ButtonLabelSample案例故事板文件Main.storyboard,如圖所示,OK按鈕是在故事板文件Main.storyboard定義的,響應事件以及處理事件應該是在程序代碼ViewController.swift實現的。那麼如何將OK按鈕點擊事件與ViewController.swift中的事件處理代碼關聯起來?不一樣的計算機語言實現的方式不一樣,在iOS和OS X應用開發中是經過目標和動做機制實現事件處理的。ide

 

 

解決方案字體

按鈕等控件是繼承自UIControl類,具備一些高級事件,目標和動做機制就是將特意的控件事件與視圖控制器(或視圖)中方法關聯起來,這個過程稱爲「定義動做事件」。「目標」是響應事件對象,爲了方便訪問其餘的控件狀態,這個對象通常是視圖控制器(或視圖)。「動做」是控件的事件。網站

ButtonLabelSample案例中按鈕是在故事板文件(或Xib文件)中定義的,響應按鈕點擊事件(動做)是在視圖控制器(目標)的方法中定義的,以下圖所示,經過定義動做事件方式把目標與動做鏈接起來。ui

 

 

 

要實現目標與動做的鏈接有兩種方式:Interface Builder連線實現和編程實現。spa

1. Interface Builder連線實現設計

Interface Builder連線實現就是故事板或Xib文件中,經過連線而現實。

2. 編程實現

編程實現是經過UIControl類addTarget(_:action:forControlEvents:)方法實現的,主要代碼以下:

class ViewController: UIViewController {

 

    override func viewDidLoad() {

        super.viewDidLoad()

       

        self.view.backgroundColor = UIColor.whiteColor()

       

        let screen = UIScreen.mainScreen().bounds;

        let labelWidth:CGFloat = 90

        let labelHeight:CGFloat = 20

        let labelTopView:CGFloat = 150

        let label = UILabel(frame: CGRectMake((screen.size.width

          Ê- labelWidth)/2 , labelTopView, labelWidth, labelHeight))

       

        label.text = "Label"

        //字體左右劇中

        label.textAlignment = .Center

        self.view.addSubview(label)

       

        let button = UIButton(type: UIButtonType.System)// 建立UIButton對象

        button.setTitle("OK", forState: UIControlState.Normal)

       

        let buttonWidth:CGFloat = 60

        let buttonHeight:CGFloat = 20

        let buttonTopView:CGFloat = 240

       

        button.frame = CGRectMake((screen.size.width

            Ê - buttonWidth)/2 , buttonTopView, buttonWidth, buttonHeight)

       

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

            Ê forControlEvents: UIControlEvents.TouchUpInside)

       

        self.view.addSubview(button)  

    }

 

    func onClick(sender: AnyObject) {

        NSLog("OK Button onClick.")

    }   

 

    ...

}

 

上述代碼中建立並設置UIButton對象,其中建立UIButton對象,參數type是設置按鈕的樣式,UIButton樣式:

  •  Custom。自定義類型。若是不喜歡圓角按鈕,能夠使用該類型。
  •   System。系統默認屬性,表示該按鈕沒有邊框,在iOS 7以前按鈕默認爲圓角矩形。
  •   Detail Disclosure。細節展現按鈕 ,主要用於表視圖中的細節展現。
  •   Info Light和Info Dark。這兩個是信息按鈕 ,樣式上與細節展現按鈕同樣,表示有一些信息須要展現,或有能夠設置的內容。
  •    Add Contact。添加聯繫人按鈕

 

代碼調用addTarget(_:action:forControlEvents:)方法,方法第一個參數是target,即事件處理對象,本例中是self;方法第二個參數是action,即事件處理對象中的方法,

代碼中是"onClick:",方法第三個參數是事件,TouchUpInside事件是按鈕的觸摸點擊事件。

若是調用以下無參數方法:

func onClick() {

}

調用代碼以下:

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

        Ê forControlEvents: UIControlEvents.TouchUpInside)

 

區別在於action參數"onClick"方法名不一樣,action參數方法名的冒號暗示了方法名應該具備幾個參數。若是要調用的方法是以下3個參數形式:

func onClick(sender: AnyObject, forEvent event: UIEvent) {

}

 

那麼調用代碼以下:

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

        Ê forControlEvents: UIControlEvents.TouchUpInside)

 

其中"onClick:forEvent:"是調用方法名,onClick表示方法名也是,forEvent表示第二個參數的外部參數名。

 

 

 

歡迎關注關東昇新浪微博@tony_關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
  ​
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php

相關文章
相關標籤/搜索