从单独的班级辞职第一响应者

Posted

技术标签:

【中文标题】从单独的班级辞职第一响应者【英文标题】:Resign first responder from separate class 【发布时间】:2011-06-18 04:34:39 【问题描述】:

我有一个类可以制作一个键盘工具栏,上面有“下一个”、“上一个”和“完成”按钮。这个类有没有办法随时知道(或找出)屏幕上的对象?

例如,它能否看到当前视图是什么以及上面的文本字段是什么,然后能够让第一响应者辞职?

【问题讨论】:

【参考方案1】:

如果您特别想辞职第一响应者而不需要知道哪个视图是第一响应者,您可以将 resignFirstResponder 发送到“nil”,如下所示:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

这是记录在案的行为,尽管我现在无法在文档中找到。

【讨论】:

【参考方案2】:

有没有办法让这个班级知道 (或找出)什么物体在 当时的屏幕?

找到 momma 视图,您可以像这样遍历屏幕上的所有对象(因为它们也将是 UIView)。请注意,您可能需要添加递归:

for (UIView *view in mommaView.subviews) 
    do something to the view

【讨论】:

【参考方案3】:

您可以从 Window 类开始,然后从那里向下,询问 [view respondsTo:@selector(isFirstResponder) && [view isFirstResponder]。我使用的一些调试代码可能会作为模板派上用场,也可以在调试时派上用场:

+ (void) dumpWindowFrom:(NSString *) fromText 
    [self dumpViews:[[UIApplication sharedApplication] keyWindow] from:fromText];


void dumpViewsRecursive(UIView* view, NSString *text, NSString *indent) 

    Class cl = [view class];
    NSString *classDescription = [cl description];
    //  while ([cl superclass])   //restore to print superclass list
    //  
    //      cl = [cl superclass];
    //      classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]];
    //  

    if ([text compare:@""] == NSOrderedSame)
        NSLog(@"%d: %@ %@ %@", (int)view, classDescription, NSStringFromCGRect(view.frame), view.hidden ? @"Inv" : @"Vis");
    else
        NSLog(@"%d: %@ %@ %@ %@", (int)view, text, classDescription, NSStringFromCGRect(view.frame), view.hidden ? @"Inv" : @"Vis");

    for (NSUInteger i = 0; i < [view.subviews count]; i++)
    
        UIView *subView = [view.subviews objectAtIndex:i];
        NSString *newIndent = [[NSString alloc] initWithFormat:@"  %@", indent];
        NSString *msg = [[NSString alloc] initWithFormat:@"%@%d:", newIndent, i];
        dumpViewsRecursive (subView, msg, newIndent);
        [msg release];
        [newIndent release];
    


+ (void) dumpViews: (UIView *) view 
    dumpViewsRecursive  (( (!view) ? [[UIApplication sharedApplication] keyWindow] : view), @"" ,@"");


+ (void) dumpViews: (UIView *) view from:(NSString *) fromText
    dumpViewsRecursive ((!view) ? [[UIApplication sharedApplication] keyWindow] : view, fromText, @"");

【讨论】:

【参考方案4】:

是的,只要 textField 变为活动状态,就会调用下面提供的方法。我想你正在寻找

- (BOOL) textFieldShouldReturn:(UITextField *)textField

[textField resignFirstResponder];
return 1;

- (void) textFieldDidBeginEditing:(UITextField *)textField

[textField resignFirstResponder];


- (void) textFieldDidEndEditing:(UITextField *)textField

[textField resignFirstResponder];

如果您正在视图中寻找特定的文本字段,您应该为它们分配标签:

textField.tag =1 // for textField 1
textField.tag =2 // for textField 2

// You may check for these tags and then resign specific ones. 

【讨论】:

以上是关于从单独的班级辞职第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

iPhone-在 UITextField 上辞职第一响应者后,无法重新聚焦

iOS:响应者辞职时,文本从子类 UITextfield 中消失

自定义 uiview 从 First Responder 辞职

刷新键盘而不辞职并成为第一响应者

触摸 contentview 后辞职第一响应者

UITextField,辞职第一响应者时,导致文本的奇怪动画滚动