我想获得第一个响应者的视图,目前我有一个包含UITextFields的UITableView,使用方法:
-(UIView*) findFirstResponder
{
}
我希望能够获得第一个响应者的视图,然后对该视图执行某些操作。
有什么想法吗?
答案 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
中,UIKit
,superview
,UIViewController
或UIWindow
将是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;
}
}
}
}