-(void)addObserver:(NSObject *)observer
-(void)observeValueForKeyPath:(NSString *)keyPath
Target-action 设计模式
目标事件的设计模式使用非常广泛,下面是我认为总结的比较好的,所以就转过来用了。大家可以看一下。
其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那个方法。如:按下按钮时,调用Controller里边的click方法。“那个对象”就是Target,“那个方法”就是Action,及Controller是Targer,click方法是action。
一般Target都是Controller,而Action有它自己固有的格式:-(IBAction)click:(id)sender。
如下图所示,target是处理交互事件的对象实例,action是target对象中处理该事件的方法。
这里有两种方式给“炒菜”按钮设置Action:
1、直接拖拽连线
2、以代码的方式实现
在iOS中有一个UIControl类,该类中定义了一个
-(void)addTarget:(id)target action:(SEL) forControlEvents:(UIControlEvents)controlEvents
- (void)viewDidLoad{ [super viewDidLoad]; // 给炒菜按钮添加点击事件 // 使用Target-action设计模式,在两个对象间直接发送消息 [self.btnCooking addTarget:self action:@selector(pressCooking:) forControlEvents:UIControlEventTouchUpInside];}
1、self 指目标对象为当前对象,及WViewController;
2、action 即 在目标对象上的点击方法;
3、何时调用该方法,UIControlEventTouchUpIns
“炒菜”按钮是一个可交互的视图控件,点击它后,它指定了一个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];}
1、UIControlEventTouchDown
指鼠标左键按下(注:只是“按下”)的动作
2、UIControlEventTouchDownR
指鼠标左键连续多次重复按下(注:只是“按下”)的动作,比如,鼠标连续双击、三击、……、多次连击。
说明:多次重复按下时,事件序列是这样的:
UIControlEventTouchDown
(UIControlEventTouchUpIns
UIControlEventTouchDown
UIControlEventTouchDownR
(UIControlEventTouchUpIns
UIControlEventTouchDown
UIControlEventTouchDownR
(UIControlEventTouchUpIns
......
除了第一次按下外,后面每次摁下都是一个UIControlEventTouchDown事件,然后紧跟一个UIControlEventTouchDownR
3、UIControlEventTouchDragI
指按下鼠标,然后在控件边界范围内拖动。
4、UIControlEventTouchDragO
与UIControlEventTouchDragI
但首先得有个UIControlEventTouchDown事件,然后接一个UIControlEventTouchDragI
具体操作是:在控件里面按下鼠标,然后拖动到控件之外。
5、UIControlEventTouchDragE
指拖动动作中,从控件边界外到内时产生的事件。
6、UIControlEventTouchDragE
指拖动动作中,从控件边界内到外时产生的事件。
7、UIControlEventTouchUpIns
指鼠标在控件范围内抬起,前提先得按下,即UIControlEventTouchDown或UIControlEventTouchDownR
8、UIControlEventTouchUpOut
指鼠标在控件边界范围外抬起,前提先得按下,然后拖动到控件外,即
UIControlEventTouchDown
UIControlEventTouchDragI
UIControlEventTouchDragE
UIControlEventTouchDragO
时间序列,再然后就是抬起鼠标,产生UIControlEventTouchUpOut
@required
- returnChooseDay:(id)myChooseDayView;
@optional
- hideThisView;
- changeDateFormatter:(NSString*)formatString;
@end
- doSomething;
@end
MyChooseTimeViewDelegate
@interface MyClassView:UIViewController <MyChooseDayViewDelegate, UIAlertViewDelegate>
//TODO: balabalabala...
@end
想要检查某个类是否实现了某个协议或者某个类是否实现了某个协议的方法,可以通过以下方式来进行测试
//获取某个对象
MyClassView *myClassView = xxxxxxx;
//判断该对象是否实现了MyChooseDayViewDelegate协议
if([myClassView conformToProtocol:@protocol (MyChooseDayViewDelegate)]){
//TODO: balabalabala...
}
//判断对象是否实现了某个方法就用我们经常会使用到的
if([myClassView responseToSelector:@selector(xxxx)]){
//TODO: balabalabala...
}
举例来说,我在办公室里正在写代码,突然发现口很渴像喝瓶冰百事,但下楼是件麻烦的事情,我不愿意下楼。这个时候我想起小卖部可以商品加价2元就外送到家服务,我就打电话给小卖部,委托小卖部给我送一瓶水上来。这个时候,小卖部就是我的代理,我委托他帮买水并送上来。这个例子中小卖部是我的代理,商品加价2元外送到家服务就是商品买卖协议(这个叫法肯定不是最佳的,姑且这么叫吧)中的一个方法。
不要觉得麻烦,我们再最后理一遍,小卖部遵守商品买卖协议,我让小卖部成为了我的代理,代替我完成了买瓶冰百事的事情。
以iOS开发的角度来说,UIViewController想使用一个tableview,需要遵守UITableviewDataSource,UITableViewDelegate这2个协议,同时设置tableview的代理为自身,才可以完整的实现Table。