查找这是第一个响应者

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

-(UIView*) findFirstResponder { } 

我希望能够得到第一个响应者的观点,然后用这个观点做一些事情。

有任何想法吗?

我所要做的只是

 @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 

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

 UIControl *currentControl; 

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

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { currentControl = textField; . . . 

在iOS中findfirstResponder没有简单的方法。 上面的答案只跟踪UIViewUIResponder所有子类如UIViewController都可以成为第一个响应者。

根据UIResponderQuick Help

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

唯一的方法来跟随UIResponder链将使用UIRespondernext: UIResponder属性。

返回响应者链中的下一个响应者,如果没有下一个响应者,则返回nil。 UIResponder类不会自动存储或设置下一个响应者,所以此方法默认返回nil。 子类必须重写此方法并返回相应的下一个响应者。 例如,UIView实现这个方法并返回pipe理它的UIViewController对象(如果有的话)或者它的超级视图(如果没有的话)。 UIViewController类似地实现该方法并返回其视图的超级视图。 UIWindow返回应用程序对象。 UIApplication返回nil。

在大多数的UIKit对象superviewUIViewControllerUIWindowUIApplicationAppdelegate将成为next UIResponder

 extension UIResponder { func findFirstResponder() -> UIResponder? { var responder: UIResponder? = self while responder != nil { guard let r = responder, r.isFirstResponder() else { responder = responder?.next continue } return r } return nil } } 

然而,上述不追踪responder的兄弟姐妹。 我想如果你真的想跟踪他们,你需要检查响应者的types,并跟踪其子(子视图,子视图控制器)。

我想与你分享我的实现在UIView的任何地方find第一响应者。 我希望这对我的英语有帮助和抱歉。 谢谢

 + (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; } } } }