Target-action:目標-動做模式,它貫穿於iOS開發始終。可是對於初學者來講,仍是被這種模式搞得一頭霧水。html
其實Target-action模式很簡單,就是當某個事件發生時,調用那個對象中的那個方法。如:按下按鈕時,調用Controller裏邊的click方法。「那個對象」就是Target,「那個方法」就是Action,及Controller是Targer,click方法是action。ios
通常Target都是Controller,而Action有它本身固有的格式:-(IBAction)click:(id)sender。設計模式
以下圖所示,target是處理交互事件的對象實例,action是target對象中處理該事件的方法。app
這裏有兩種方式給「炒菜」按鈕設置Action:ide
一、直接拖拽連線學習
二、以代碼的方式實現ui
在iOS中有一個UIControl類,該類中定義了一個spa
-(void)addTarget:(id)target action:(SEL) forControlEvents:(UIControlEvents)controlEvents
方法,大部分視圖類都繼承自UIControl類,因此"炒菜"按鈕可使用該方法實現Target-action模式。在iOS中這種設計模式被稱做一個對象給另一個對象發送消息。設計
- (void)viewDidLoad { [super viewDidLoad]; // 給炒菜按鈕添加點擊事件 // 使用Target-action設計模式,在兩個對象間直接發送消息 [self.btnCooking addTarget:self action:@selector(pressCooking:) forControlEvents:UIControlEventTouchUpInside]; }
一、self 指目標對象爲當前對象,及WViewController;code
二、action 即 在目標對象上的點擊方法;
三、什麼時候調用該方法,UIControlEventTouchUpInside即單擊時。
「炒菜」按鈕是一個可交互的視圖控件,點擊它後,它指定了一個target(目標對象),並執行目標對象上指定的action(方法)。
action方法有如下幾種形式:
- (void)doSomething; // OR - (void)doSomething:(id)sender; // OR - (IBAction)doSomething:(id)sender; // OR - (IBAction)doSomething:(UIButton *) sender;
這裏的sender,發送者,就是對 「菜單」 按鈕對象的引用。
如下代碼是徹底用代碼定義的一個UIButton,並添加在self.view中:
- (void)viewDidLoad { [super viewDidLoad]; // 實例化按鈕,並設置按鈕類型爲圓角 UIButton *btnCustom = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // 設置按鈕大小 btnCustom.frame = CGRectMake(124, 140, 73, 44); // 設置按鈕標題 [btnCustom setTitle:@"點擊我..." forState:UIControlStateNormal]; // 設置按鈕點擊事件 [btnCustom addTarget:self action:@selector(customButton) forControlEvents:UIControlEventTouchUpInside]; // 將按鈕添加到View [self.view addSubview:btnCustom]; } /** 自定義按鈕點擊方法 */ - (void)customButton{ [self.lblDish setText:self.txtMaterial.text]; }
UIButton的幾種觸發方式:
一、UIControlEventTouchDown
指鼠標左鍵按下(注:只是「按下」)的動做
二、UIControlEventTouchDownRepeat
指鼠標左鍵連續屢次重複按下(注:只是「按下」)的動做,好比,鼠標連續雙擊、三擊、……、屢次連擊。
說明:屢次重複按下時,事件序列是這樣的:
UIControlEventTouchDown ->
(UIControlEventTouchUpInside) ->
UIControlEventTouchDown ->
UIControlEventTouchDownRepeat ->
(UIControlEventTouchUpInside) ->
UIControlEventTouchDown ->
UIControlEventTouchDownRepeat ->
(UIControlEventTouchUpInside) ->
......
除了第一次按下外,後面每次摁下都是一個UIControlEventTouchDown事件,而後緊跟一個UIControlEventTouchDownRepeat事件。
三、UIControlEventTouchDragInside
指按下鼠標,而後在控件邊界範圍內拖動。
四、UIControlEventTouchDragOutside
與UIControlEventTouchDragInside不一樣的是,拖動時,鼠標位於控件邊界範圍以外。
但首先得有個UIControlEventTouchDown事件,而後接一個UIControlEventTouchDragInside事件,再接一個UIControlEventTouchDragExit事件,這時,鼠標已經位於控件外了,繼續拖動就是UIControlEventTouchDragOutside事件了。
具體操做是:在控件裏面按下鼠標,而後拖動到控件以外。
五、UIControlEventTouchDragEnter
指拖動動做中,從控件邊界外到內時產生的事件。
六、UIControlEventTouchDragExit
指拖動動做中,從控件邊界內到外時產生的事件。
七、UIControlEventTouchUpInside
指鼠標在控件範圍內擡起,前提先得按下,即UIControlEventTouchDown或UIControlEventTouchDownRepeat事件。
八、UIControlEventTouchUpOutside
指鼠標在控件邊界範圍外擡起,前提先得按下,而後拖動到控件外,即
UIControlEventTouchDown ->
UIControlEventTouchDragInside(n 個) ->
UIControlEventTouchDragExit ->
UIControlEventTouchDragOutside(n 個)
時間序列,再而後就是擡起鼠標,產生UIControlEventTouchUpOutside事件。
事例傳送門:TargetActionPattern
參考:
二、http://blog.teamtreehouse.com/ios-design-patterns-target-action-part-1
著做權聲明:本文由 http://wzrong.cnblogs.com 或者 http://iostour.diandian.com 原創,歡迎轉載分享。 請尊重做者勞動,轉載時保留該聲明和做者博客連接,謝謝!
原創文章,如需轉載請註明出處,謝謝!
歡迎訪問本人技術微博 @iOS之旅 相互交流,共同窗習,共同進步!
歡迎訪問本人微博 @衛志榮