查找作为第一响应者的视图

时间:2012-03-26 15:01:00

标签: iphone ios first-responder

我想获得第一个响应者的视图,目前我有一个包含UITextFields的UITableView,使用方法:

-(UIView*) findFirstResponder
{

}

我希望能够获得第一个响应者的视图,然后对该视图执行某些操作。

有什么想法吗?

4 个答案:

答案 0 :(得分:18)

我所要做的只是

@implementation UIView (FindViewThatIsFirstResponder)
- (UIView *)findViewThatIsFirstResponder
{
    if (self.isFirstResponder) {        
        return self;     
    }

    for (UIView *subView in self.subviews) {
        UIView *firstResponder = [subView findViewThatIsFirstResponder];
        if (firstResponder != nil) {
            return firstResponder;
        }
    }

    return nil;
}
@end

答案 1 :(得分:14)

使用UIControl作为可以成为第一响应者的不同类型控件的根引用。

UIControl *currentControl;

正如Gobot所说 - 每当文本字段成为第一响应者时,请记下它是哪一个......

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {   

    currentControl = textField;

    . . .

答案 2 :(得分:1)

在iOS中找不到firstResponder没有简单的方法。上面的答案仅跟踪UIView,但UIResponder的所有子类(例如UIViewController)都可以作为第一响应者。

根据Quick Help的{​​{1}}:

  

许多关键对象也是响应者,包括UIApplication   object,UIViewController对象和所有UIView对象(其中   包括UIWindow)。当事件发生时,UIKit会将它们发送给您   应用程序的响应程序对象进行处理。

关注UIResponder链的唯一方法是使用UIResponder的{​​{1}}属性。

  

返回响应者链中的下一个响应者,如果有,则返回nil   没有下一个响应者。 UIResponder类不存储或设置   下一个响应者自动,所以这个方法默认返回nil。   子类必须覆盖此方法并返回适当的next   响应者。例如,UIView实现此方法并返回   UIViewController对象管理它(如果它有一个)或它   超级视图(如果没有)。 UIViewController类似地实现了   方法并返回其视图的超级视图。 UIWindow返回   应用对象。 UIApplication返回nil。

在大多数UIResponder对象next: UIResponder中,UIKitsuperviewUIViewControllerUIWindow将是UIApplication { {1}}。

Appdelegate

然而,上述内容并未跟踪next的兄弟姐妹。我想如果你真的想跟踪它们,你需要检查响应者的类型并跟踪它的子(子视图,子视图控制器)。

答案 3 :(得分:0)

我想与您分享我在UIView的任何地方找到第一响应者的实现。我希望它对我的英语有所帮助和抱歉。感谢

+ (UIView *) findFirstResponder:(UIView *) _view {
   if ([subView isFirstResponder])
      return subView;
   if ([subView isKindOfClass:[UIView class]]) {
      UIView *v = subView;

      if ([v.subviews count] > 0) {
         retorno = [self findFirstResponder:v];
         if ([retorno isFirstResponder]) {
             return retorno;
         }
      }
   }
}