使用UITextField了解resignFirstResponder

时间:2012-08-12 17:58:19

标签: ios resignfirstresponder

当用户触摸我的UITextField外,我正试图摆脱键盘,使用这种方法:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [mainTextController resignFirstResponder];
    [super touchesBegan:touches withEvent:event];
}

然而,这似乎调用了一个按下键盘上的返回按钮后调用的方法,但我只是希望键盘消失,而不是按回车键。 我怎么能做到这一点?

谢谢!

编辑:tGilani的答案是最直接的方式,就像魅力一样,无需更改为UIControl。但我想jonkroll的答案也有效。

3 个答案:

答案 0 :(得分:13)

[self.view endEditing:YES];

更新

取一个布尔值并在init方法中将其设置为false。在textFieldShouldReturn委托方法方法中,如果代码为false则执行代码,否则跳过

- (BOOL) textFieldShouldReturn:(UITextField*)textField
{
    if (!boolean)
    {
        // YOur code logic here
    }
    boolean = false;
}

在你调用endEditing方法的方法中,将boolean设置为true。

boolean = YES;      
[self.view endEditing:YES];

答案 1 :(得分:8)

以下是我以前处理过这个问题的方法。首先在视图控制器上创建一个方法,通过在文本字段中重新设置第一响应者状态来关闭键盘:

- (IBAction)dismissKeyboard:(id)sender
{
    [mainTextController resignFirstResponder];
}

接下来,在ViewController(或nib,如果您没有使用故事板)的故事板场景中,将ViewController的view属性的类从UIView更改为UIControlview属性实际上是其他UI元素背后的背景。需要更改类类型,因为UIView无法响应触摸事件,但UIControlUIView的直接子类)可以响应它们。

最后,在ViewController的viewDidLoad:方法中,告诉视图控制器在视图收到dismissKeyboard事件时执行UIControlEventTouchDown方法。

- (void)viewDidLoad
{
    [super viewDidLoad];       
    UIControl *viewControl = (UIControl*)self.view;
    [viewControl addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchDown];
}

编辑:

您关注的部分原因似乎是当键盘被解除时调用textFieldDidEndEditing:。这是不可避免的,只要文本字段失去焦点(即第一响应者状态),就会始终调用它。听起来您的问题是,当用户单击textFieldDidEndEditing:中的返回按钮时,您已执行代码。如果您不希望在用户触摸文本字段之外时运行该代码,则不适合放置该代码。

相反,我会将该代码放在一个单独的方法中:

- (IBAction)textFieldReturn:(id)sender
{
    if ([mainTextController isFirstResponder]) {
            [mainTextController resignFirstResponder];

            // put code to run after return key pressed here...
        }
    }
}

然后在文本字段发送控件事件UIControlEventEditingDidEndOnExit时通过Target-Action调用该方法。

[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];

请注意,UIControlEventEditingDidEndOnExitUIControlEventEditingDidEnd不同。当用户触摸控件外部时编辑结束时调用前者,当用户按下返回键结束编辑时调用后者。

答案 2 :(得分:0)

您需要使用Identity Inspector将ViewController's视图属性从UIView更改为UIControl

从那里,你只需创建一个IBAction并告诉文本字段被忽略(我假设你是mainTextController)。如果mainTextController不是您希望键盘关闭的文本字段,请将resignFirstReaponder方法更改为您的文本字段。

- (IBAction)backgroundTap:(id)sender {
[myTextField resignFirstResponder];
}

然后从那里返回View Contoller的.xib文件并将操作连接到Control View并选择“Touch Down”。