有什么办法可以让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,文本字段甚至从来没有问过;它被迫辞职。