有什么办法可以让iOS查看哪些孩子有第一响应者状态?

在Mac OS X中,您可以find如下的第一个响应者:

[[self window] firstResponder] 

有什么办法在iOS中做到这一点? 或者您是否需要枚举子控件并向每个控件发送isFirstResponder消息?

您需要迭代所有子控件并testingisFirstResponder属性。 当你遇到TRUE ,跳出循环。

 UIView *firstResponder; for (UIView *view in self.view.subviews) //: caused error { if (view.isFirstResponder) { firstResponder = view; break; } } 

更好的解决scheme

看雅各布的答案 。

我真的很喜欢VJK的解决scheme ,但是正如MattDiPasquale所说,它似乎比必要的更复杂。 所以我写了这个更简单的版本:

 #import "UIResponder+FirstResponder.h" static __weak id currentFirstResponder; @implementation UIResponder (FirstResponder) +(id)currentFirstResponder { currentFirstResponder = nil; [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil]; return currentFirstResponder; } -(void)findFirstResponder:(id)sender { currentFirstResponder = self; } @end 

因为这似乎更有意义,所以我也把它作为一个类的方法。 您现在可以find第一个响应者,如下所示: [UIResponder currentFirstResponder]

我在UIResponder上写了一个类别来查找第一个响应者

 @interface UIResponder (firstResponder) - (id) currentFirstResponder; @end 

 #import <objc/runtime.h> #import "UIResponder+firstResponder.h" static char const * const aKey = "first"; @implementation UIResponder (firstResponder) - (id) currentFirstResponder { [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:self forEvent:nil]; id obj = objc_getAssociatedObject (self, aKey); objc_setAssociatedObject (self, aKey, nil, OBJC_ASSOCIATION_ASSIGN); return obj; } - (void) setCurrentFirstResponder:(id) aResponder { objc_setAssociatedObject (self, aKey, aResponder, OBJC_ASSOCIATION_ASSIGN); } - (void) findFirstResponder:(id) sender { [sender setCurrentFirstResponder:self]; } @end 

然后在从UIResponder派生的任何类中,都可以通过调用来获得第一个响应者

 UIResponder* aFirstResponder = [self currentFirstResponder]; 

但请记得首先导入UIResponder类别接口文件!

这使用logging的API,所以应该没有app store拒绝问题。

如果你需要第一响应者,那么你可以要求它辞职,这是一个让你辞职的方法。 UIView有一个方法,将遍历所有的UIView子视图,并要求任何第一响应者辞职。

 [[self view] endEditing:YES]; 

这是一个链接到苹果的UIView文档 “这个方法看当前的视图和它的子视图层次的文本字段,当前是第一响应者。如果它find一个,它要求文本字段作为第一响应者辞职。如果力量参数设置为YES,文本字段甚至从来没有问过;它被迫辞职。