使用UITextField理解resignFirstResponder

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

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

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

谢谢!

编辑:tGilani的答案是最直接的方式,就像一个魅力,没有改变UIControl。 但我猜Jonkroll的答案也适用。

尝试

 [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]; 

以前是我以前处理过的。 首先在您的视图控制器上创build一个方法,通过在您的文本字段上放弃第一个响应者状态来closures键盘:

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

接下来,在你的ViewController (或者nib ,如果你不使用storyboard)的storyboard场景中,将ViewController的view属性的类从UIView更改为UIControlview属性实际上是其他UI元素背后的背景。 类的types需要改变,因为UIView不能响应触摸事件,但UIControl (它是UIView的直接子类)可以响应它们。

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

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

编辑:

你关心的一部分似乎是textFieldDidEndEditing:当键盘被解除时被调用。 这是不可避免的,只要文本字段丢失焦点(即第一响应者状态),就会始终调用它。 这听起来像你的问题是,当用户单击textFieldDidEndEditing:的返回button时,你已经把代码执行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]; 

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

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

从那里,你只需创build一个IBAction并告诉文本字段解散(我认为是你的mainTextController )。 如果mainTextController不是您希望键盘忽略的resignFirstReaponder字段, resignFirstReaponder方法更改为像这样的文本字段。

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

然后从那里返回到您的视图控制器的.xib文件,并将操作连接到控制视图,然后select“触摸”。