IOS宏定义(方法名称做参数)和respondToSelector

来源:互联网 发布:单片机入门书籍 编辑:程序博客网 时间:2024/06/06 00:31

我写一个宏定义,来写点击界面背景的手势处理([self.view endEditing:yes])

//给背景设置tap点击手势

#define addTapRecognizer(p_tapMethodName,p_delegate,p_target,p_View_Container)\

{\

SEL selector1 = NSSelectorFromString(p_tapMethodName);\

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:p_target action:selector1];\

tapRecognizer.cancelsTouchesInView = NO;\

tapRecognizer.delegate = p_delegate;\

[p_View_Container addGestureRecognizer:tapRecognizer];\

}\

//

UIGestureRecognizerDelegate的代理函数

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

{

//return  ![touch.view.superview isKindOfClass:[UITextField class]];

return ![touch.view isKindOfClass:[UIButton class]];

}


一,调用

-(void)viewDidLoad

{

    addTapRecognizer(@"handleBackgroundTap:", self, self,self.view);

}

我写个方法的原因是,界面背景有个tap事件,点击背景,键盘消失,但是,点击textField的clear按钮时候,有时候,键盘是消失了,但是并没有对textField的内容进行清理,这就是说,触发了tap手势事件,没有触发textField的clear事件。

这个现象的原因是,无论点击到界面的哪里,label,button ,textField,都会触发tap的代理事件(gestureRecognizer:),但不一定触发自己写的tap处理事件(handleBackgroundTap:),代理事件返回yes不一定触发自定义的tap处理事件,但如果代理事件返回NO,一定不触发tap自定义处理事件。

现在我按这个写,问题解决了,但是有个弊端,就是点击按钮的时候,键盘不消失了,需要手动设置代码让键盘消失。



二,关于宏展开

#define addTapRecognizer(tapMethodName,delegate,target,View_Container)\

{\

SEL selector1 = NSSelectorFromString(tapMethodName);\

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:target action:selector1];\

tapRecognizer.cancelsTouchesInView = NO;\

tapRecognizer.delegate = delegate;\

[View_Container addGestureRecognizer:tapRecognizer];\

}\

调用    addTapRecognizer(@"handleBackgroundTap:",self,self,self.view);

上面蓝色标记展开如下:tapRecognizer.self = self;
系统会报错:setSelf没有这个方法


三,一些重要的方法
-(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例
-(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例
-(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递)
+(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上.
-(id) performSelector: selector
SEL sel = @selector (start:) ; // 指定action  
if ([obj respondsToSelector:sel]) 
{ //判断该对象是否有相应的方法  
[obj performSelector:sel withObject:self]; //调用选择器方法  



0 0
原创粉丝点击