Objective-C,如何一般resignFirstResponder?

时间:2010-09-03 10:31:19

标签: ios objective-c

(我的老板说)我必须在navBar上实现“完成”按钮,以便视图中的各个项目(包含编辑框)将关闭他们的键盘(如果它们处于焦点)。

似乎我必须遍历所有项目,然后在其中一个人聚焦的可能性上调用resignFirstResponder?这看起来有点混乱(如果例如其他人在将来添加更多项目时难以维护) - 有更好的方法吗?

4 个答案:

答案 0 :(得分:12)

我找到了它!

感谢this

我发现我需要做的就是: -

-(void) done {
    [[self.tableView superview] endEditing:YES];
}

//也[self.view endEditing:YES];工作正常

[备注] 另外,我学会了如何做一个“eventFilter”来阻止UITableViewController吞噬背景触摸事件,通过在到达那里之前拦截它们来自该线程上相同的精彩帖子 - 请参阅“DismissableUITableView” 。 [评论结束]

答案 1 :(得分:0)

您不必遍历控件,因为此刻只有一个可以成为第一响应者。

这会将响应者重置为Window本身:     [[自我窗口] makeFirstResponder:nil]

答案 2 :(得分:0)

一种解决方案是使用currentTextField对象

在.h文件中有一个实例变量

UITextField *currentTextField;

现在在.m文件中。

注意:不要忘记将所有textField的委托设置为此类

- (void)textViewDidBeginEditing:(UITextView *)textView
{
   currentTextField = textField;
}

- (void)textViewDidEndEditing:(UITextView *)textView
{
   currentTextField = nil;
}

现在使用按钮操作方法

-(IBAction)buttonTap
{
    if([currentTextField isFirstResponder])
        [currentTextField resignFirstResponder];
}

这可以避免遍历所有文本字段。

答案 3 :(得分:0)

我认为通过使用递归函数搜索主视图的所有子视图来处理它的最佳方法,请查看下面的示例

- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
    [self resignFirstResponder];
    return YES;
}

    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder]) {
            return YES;
        }
    }
    return NO;
}

并且您也可以将此方法放到您的实用程序类中,并可以使用轻击手势。您只需添加手势即可查看。

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(hideEverything)];
[self.tableView addGestureRecognizer:gestureRecognizer];

并且你可以调用hideEverything方法;

- (void) hideKeyboard {
    [self.view findAndResignFirstResponder];
    ...
    ...
}