码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 键盘第一响应

时间:2015-05-05 16:36:05      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:ios   ios开发   uitextfield   控件   

. UIResonder

对于C#里所有的控件(例如TextBox),都继承于Control类。而Control类的继承关系如
下:

System.Object 

  System.MarshalByRefObject

    System.ComponentModel.Component

      System.Windows.Forms.Control

对于iOS里的UI类,也有类似的继承关系。

例如对于UITextField,继承于UIControl;UIControl继承于UIView,UIView继承于UIRe
sponder,UIResponder继承于NSObject。

具体架构可以参见:

http://developer.apple.com/library/ios/#documentation/general/conceptual/Devp
edia-CocoaApp/Responder.html

技术分享


UIResponder是UIKit框架中的类(Mac OS X Cocoa对应的是AppKit框架)。

 

2. 第一响应对象

在应用的响应对象里,会有一个成为第一响应对象。

第一响应对象和其他响应对象之间有什么区别?对于普通的触摸事件没什么区别。就算
我把一个按钮设置成第一响应对象,当我点击其他按钮时,还是会响应其他按钮,而不
会优先响应第一响应对象。

第一响应对象的区别在于负责处理那些和屏幕位置无关的事件,例如摇动。

苹果官方文档的说法是:第一响应对象是窗口中,应用程序认为最适合处理事件的对象
。

一个班只能有一个班长,应用的响应对象中,只能有一个响应对象成为第一响应对象。

 

3. 成为与取消第一响应对象。

要当第一响应对象,还需要有View来毛遂自荐:

- (BOOL) canBecomeFirstResponder
{
    returnYES;
}
 

如果缺少了这段,就算用[view becomeFirstResponder]也不能让一个view成为第一响应
对象。。。强扭的瓜不甜?好吧不是这个原因。大多数视图默认只关心与自己有关联的
事件,并且(几乎)总是有机会来处理这些事件。以UIButton为例,当用户单击某个UIB
utton对象时,无论当前的第一响应对象是哪个视图,该对象都会收到指定的动作消息。
当上第一响应对象吃力不讨好么。。。所以只能由某个UIResponder明确表示自己愿意成
为第一响应对象才行。(我不知道设计上是基于什么考虑。。。安全?)

 

在当上第一响应对象时,不同对象可能会有一些特殊的表现。例如UITextField当上的时
候,就会调出一块小键盘。

第一响应对象也有可能被辞退。发送一个resignFirstResponder,就可以劝退。

 

4. 第一响应对象的任务

刚才说了第一响应对象可以处理摇动。就来看个范例吧:

 

- (void) motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
        NSLog(@"Device is beginning to shake");
        [selfsetCircleColor:[UIColorredColor]];
        [selfsetNeedsDisplay];
    }
}
 

当摇动开始时触发某些行为。

 

5. 获取当前第一响应对象

源自这篇讨论:http://stackoverflow.com/questions/1823317/get-the-current-firs
t-responder-without-using-a-private-api 

提问的家伙用了如下的方式来获取

UIView   *firstResponder = [keyWindow 
performSelector:@selector(firstResponder)];

结果被苹果打回来,说用了非公开的API。。。

于是这家伙只好苦逼地用递归了:

implementationUIView (FindFirstResponder)
- (UIView *)findFirstResponder
{
    if (self.isFirstResponder) {        
        return self;     
    }
    for (UIView *subView in self.subviews) {
        UIView *firstResponder = [subView findFirstResponder];
        if (firstResponder != nil) {
            return firstResponder;
        }
    }
    return nil;
} 
@end
 

iOS 键盘第一响应

标签:ios   ios开发   uitextfield   控件   

原文地址:http://blog.csdn.net/yangchen9931/article/details/45502811

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!