6

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

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

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

谢谢!

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

4

3 回答 3

13

尝试

[self.view endEditing:YES];

更新:

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

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

在调用 endEditing 方法的方法中,将布尔值设置为 true。

boolean = YES;      
[self.view endEditing:YES];
于 2012-08-12T18:01:13.477 回答
8

这是我以前处理过的方法。首先在您的视图控制器上创建一个方法,该方法将通过在您的文本字段上退出第一响应者状态来关闭键盘:

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

接下来,在您的故事板场景中ViewController(或者nib,如果您不使用故事板)将 ViewControllerview属性的类从UIView更改为UIControl。该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];
}

编辑:

您的部分担忧似乎textFieldDidEndEditing:是在关闭键盘时调用。这是不可避免的,每当文本字段失去焦点(即第一响应者状态)时,它总是会被调用。听起来您的问题是当用户单击返回按钮时,您已经放置了要执行的代码textFieldDidEndEditing:。如果您不希望在用户触摸文本字段外部时运行该代码,那么这不是放置它的合适位置。

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

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

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

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

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

请注意,UIControlEventEditingDidEndOnExit它不同于UIControlEventEditingDidEnd. 前者在用户触摸控件外部结束编辑时调用,后者在用户按回车键结束编辑时调用。

于 2012-08-12T18:41:57.197 回答
0

您需要将ViewController's视图属性从使用身份检查器更改UIView为:UIControl

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

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

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

于 2012-08-12T20:19:17.130 回答