使用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
更改为UIControl
。 view
属性实际上是其他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“触摸”。