程序员人生 网站导航

iOS 对于Target-Action设计模式的理解

栏目:综合技术时间:2015-04-09 08:51:24


iOS 开发之Target-action模式Target-action:目标-动作模式,它贯穿于 iOS 开发始终。但是对初学者来讲,还是被这类模

式弄得1头雾水。

其实 Target-action 模式很简单,就是当某个事件产生时,调用那个对象中的那个方法。如:按下按钮时,调用 Controller 里边的 click 方 法。那个对象就是 Target,那个方法就是 Action,及 Controller Targer,click 方法是 action

1般 Target 都是 Controller,而 Action 有它自己固有的格式:-(IBAction)click:(id)sender。以下图所示,target 是处理交互事件的对象实例,action target 对象中处理该事件的方法。

page2image376

这里有两种方式给炒菜按钮设置 Action:1、直接拖拽连线

page3image376

2、以代码的方式实现
iOS 中有1个 UIControl 类,该类中定义了1个

-(void)addTarget:(id)target action:(SEL)forControlEvents:(UIControlEvents)controlEvents

方法,大部份视图类都继承自 UIControl 类,所以"炒菜"按钮可使用该方法实现 Target-action模式。在 iOS 中这类设计模式被称作1个对象给另外1个对象发送消息。

- (void)viewDidLoad{ [super viewDidLoad]; // 给炒菜按钮添加点击事件 // 使用 Target-action 设计模式,在两个对象间直接发送消息[self.btnCooking addTarget:self action:@selector(pressCooking:)forControlEvents:UIControlEventTouchUpInside];}

page4image376

1self 指目标对象为当前对象,及 WViewController;

2action 即 在目标对象上的点击方法;

3、什么时候调用该方法,UIControlEventTouchUpInside 即单击时。

炒菜按钮是1个可交互的视图控件,点击它后,它指定了1个 target(目标对象),并履行目标对象上指定的 action(方法)。

action 方法有以下几种情势:

- (void)doSomething;// OR- (void)doSomething:(id)sender;// OR-(IBAction)doSomething:(id)sender;// OR-(IBAction)doSomething:(UIButton *) sender;

这里的 sender,发送者,就是对 菜单按钮对象的援用。以下代码是完全用代码定义的1个 UIButton,并添加在 self.view 中:

- (void)viewDidLoad{ [super viewDidLoad]; // 实例化按钮,并设置按钮类型为圆角 UIButton *btnCustom = [UIButtonbuttonWithType:UIButtonTypeRoundedRect]; // 设置按钮大小btnCustom.frame = CGRectMake(124, 140, 73, 44); // 设置按钮标题[btnCustom setTitle:@"点击我..." forState:UIControlStateNormal]; //设置按钮点击事件 [btnCustom addTarget:selfaction:@selector(customButton)forControlEvents:UIControlEventTouchUpInside]; // 将按钮添加到 View[self.view addSubview:btnCustom];}/** 自定义按钮点击方法 */-(void)customButton{ [self.lblDish setText:self.txtMaterial.text];}

UIButton 的几种触发方式:1UIControlEventTouchDown

指鼠标左键按下(注:只是按下)的动作2UIControlEventTouchDownRepeat

指鼠标左键连续屡次重复按下(注:只是按下)的动作,比如,鼠标连续双击、3击、......、屡次连击。

说明:屡次重复按下时,事件序列是这样的:

UIControlEventTouchDown ->

(UIControlEventTouchUpInside) ->

UIControlEventTouchDown ->

UIControlEventTouchDownRepeat ->

(UIControlEventTouchUpInside) ->

UIControlEventTouchDown ->

UIControlEventTouchDownRepeat ->

(UIControlEventTouchUpInside) ->

......

除第1次按下外,后面每次摁下都是1个UIControlEventTouchDown事件,然后紧跟1个UIControlEventTouchDownRepeat 事件。

3UIControlEventTouchDragInside指按下鼠标,然后在控件边界范围内拖动。

4UIControlEventTouchDragOutside
UIControlEventTouchDragInside 不同的是,拖动时,鼠标位于控件边界范围以外。

但首先得有个 UIControlEventTouchDown 事件,然后接1个 UIControlEventTouchDragInside事件,再接 1个 UIControlEventTouchDragExit 事件,这时候,鼠标已位于控件外了,继续拖动就是 UIControlEventTouchDragOutside 事件了。

具体操作是:在控件里面按下鼠标,然后拖动到控件以外。5UIControlEventTouchDragEnter

指拖动动作中,从控件边界外到内时产生的事件。6UIControlEventTouchDragExit

指拖动动作中,从控件边界内到外时产生的事件。7UIControlEventTouchUpInside

指鼠标在控件范围内抬起,条件先得按下,即 UIControlEventTouchDown UIControlEventTouchDownRepeat 事件。

8UIControlEventTouchUpOutside指鼠标在控件边界范围外抬起,条件先得按下,然后拖动到控件外,即UIControlEventTouchDown ->
UIControlEventTouchDragInside(n
) ->
UIControlEventTouchDragExit ->
UIControlEventTouchDragOutside(n
)
时间序列,再然后就是抬起鼠标,产生 UIControlEventTouchUpOutside 事件。

事例传送门:TargetActionPattern参考:

1http://developer.apple.com/library/ios/#documentation/general/conceptual/Devpedia-CocoaApp/TargetAction.html

2http://blog.teamtreehouse.com/ios-design-patterns-target-action-part⑴

3http://developer.apple.com/library/ios/#documentation/uikit/reference/UIControl_Class/Reference/Reference.html 


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐