查找这是第一个响应者
我想获得第一个响应者的视图,目前我有一个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
没有简单的方法。 上面的答案只跟踪UIView
但UIResponder
所有子类如UIViewController
都可以成为第一个响应者。
根据UIResponder
的Quick Help
:
许多关键对象也是响应者,包括UIApplication对象,UIViewController对象和所有UIView对象(包括UIWindow)。 当事件发生时,UIKit将它们分派给你的应用程序的响应者对象进行处理。
唯一的方法来跟随UIResponder
链将使用UIResponder
的next: UIResponder
属性。
返回响应者链中的下一个响应者,如果没有下一个响应者,则返回nil。 UIResponder类不会自动存储或设置下一个响应者,所以此方法默认返回nil。 子类必须重写此方法并返回相应的下一个响应者。 例如,UIView实现这个方法并返回pipe理它的UIViewController对象(如果有的话)或者它的超级视图(如果没有的话)。 UIViewController类似地实现该方法并返回其视图的超级视图。 UIWindow返回应用程序对象。 UIApplication返回nil。
在大多数的UIKit
对象superview
, UIViewController
, UIWindow
, UIApplication
或Appdelegate
将成为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; } } } }