我有一个包含多个UITextfields的视图,当我快速点击并在UITextFields中随机输入时,一段时间后我进入键盘显示但不会被忽略的状态。按右下方"关闭键盘"按钮不起作用。键盘上的所有按键仍会发出咔哒声,按下时会变为灰色。
在根视图控制器中,我观察所有键盘隐藏和显示事件。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShowWithNotification:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHideWithNotification:)
name:UIKeyboardDidHideNotification object:nil];
- (void)keyboardDidShowWithNotification:(NSNotification *)aNotification
{
DataViewController* theCurrentController = (DataViewController*)self.pageViewController.viewControllers[0];
float yCoord;
UITextField* text = (UITextField*)[self findFirstResponder:theCurrentController.view];
if(text.frame.origin.y < 10)
yCoord = text.superview.frame.origin.y;
else
yCoord = text.frame.origin.y;
NSLog(@"%f",yCoord);
if(yCoord > 410)
offCenter = 230;
else if (yCoord > 240)
offCenter = 150;
if(offCenter > 0)
[UIView animateWithDuration:0.3
delay:0 options:UIViewAnimationCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState
animations:^{
CGPoint adjust = CGPointMake(0, -1*offCenter);
CGPoint newCenter = CGPointMake(self.pageViewController.view.center.x+adjust.x, self.pageViewController.view.center.y+adjust.y);
[self.pageViewController.view setCenter:newCenter];
}
completion:nil];
}
- (void)keyboardDidHideWithNotification:(NSNotification *)aNotification
{
if(offCenter)
{
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState
animations:^{
CGPoint adjust = CGPointMake(0, offCenter);
CGPoint newCenter = CGPointMake(self.pageViewController.view.center.x+adjust.x, self.pageViewController.view.center.y+adjust.y);
[self.pageViewController.view setCenter:newCenter];
}
completion:nil];
}
offCenter = 0;
}
当键盘显示时,如果键盘隐藏了第一个响应者,我将视图设置为动画,以便用户可以看到UITextField。当键盘隐藏时,如果视图位于高位,则返回到中心。
在ViewController本身实现一个UITapGestureRecognizer
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)];
-(void)dismissKeyboard {
[self.heartRateTextField resignFirstResponder];
[self.systolicBPTextField resignFirstResponder];
[self.diastolicBPTextField resignFirstResponder];
}
当点击发生时,我在所有UITextFields上使用resignFirstResponder。
ViewController也是一个实现以下
的UITextFieldDelegate- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
if(([textEntered intValue] && textField.text.length < 3) || [textEntered isEqualToString:@""] || ([textEntered isEqualToString:@"0"] && textField.text.length > 0 && textField.text.length < 3))
return YES;
else
return NO;
}
即使返回按钮和键盘上的所有其他键仍处于活动状态,这两个事件句柄中的断点也不会触发。我可以点击它们,然后它们变成灰色。
当视图未处于此错误状态时,所有这些都有效。只有在随机点击和键入后,视图才会停止响应,并且不会触发这些事件。此错误状态仅发生在键盘隐藏UITextField并需要动画的页面上。此错误状态仅在视图居中时发生,从不在高时发生。仅在键盘隐藏线下方和键盘隐藏线上方的UITextField之间点击时,才会出现此错误状态。
要转义错误状态,只需点击可见的UITextField即可。 UITextField成为第一个响应者,现在所有事件都正常工作。
关于为什么会发生这种情况或如何调试此问题的任何想法?感谢。
答案 0 :(得分:0)
这对我来说有点问题:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)];
您应该尝试制作目标self.view
:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(dismissKeyboard)];
如果这不能解决问题,我会创建一个空白UIButton
,它位于视图控制器上所有其他UI元素的下方,并将UITapGestureRecognizer
的目标指定给该按钮。