使用UITextField了解resignFirstResponder

Lio*_*lak 6 ios resignfirstresponder

我试图通过使用此方法在用户触摸我的UITextField之外时摆脱键盘:

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

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

谢谢!

编辑:tGilani的答案是最直接的方式,就像一个魅力,没有改变到UIControl.但我想jonkroll的答案也有效.

tGi*_*ani 13

尝试

[self.view endEditing:YES];
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

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

boolean = YES;      
[self.view endEditing:YES];
Run Code Online (Sandbox Code Playgroud)


jon*_*oll 8

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

- (IBAction)dismissKeyboard:(id)sender
{
    [mainTextController resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:

您关注的部分内容似乎textFieldDidEndEditing:是在键盘被解除时调用的.这是不可避免的,只要文本字段失去焦点(即第一响应者状态),就会始终调用它.听起来你的问题是,当用户点击返回按钮时,你已经放置了代码textFieldDidEndEditing:.如果您不希望在用户触摸文本字段之外时运行该代码,那么这不是放置它的正确位置.

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

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

            // put code to run after return key pressed here...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit];
Run Code Online (Sandbox Code Playgroud)

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