- 我发现自己有时候是有点强迫症,本来今天是想梳理一下ios各种设计模式的,但是总是想起二月九号在南京玩耍用滴滴时遇到的问题,加个班的话看看今天能不能写完一部分的设计模式。事情是酱紫的,滴滴在第一次使用时先是填写手机号,然后验证码,但是我在填写验证码是键盘无论如何都不能弹出,感觉很是郁闷。想了想很可能是我禁止了系统键盘的缘故,改完后可以正常输入了。看来bug总是很容易不期而遇的,无关公司,无关人力,正所谓众里寻他千百度,那‘人'却在灯火阑珊处。
- 另外在弹出notification时,点击按钮后验证码又可以正常输入,这有点奇怪。
(注释:所有测试均是在7p version:10.2.1下进行。)
bug截图
原因猜测
- 在这一步可能不支持第三方键盘,但是考虑到只是个验证码,应该不会这么严格。
- 在代理设置方面可能有什么猫腻,导致没有接受到notification。
尝试解决
自己简单的写了个demo,大致如下。
UITextField * textField = [[UITextField alloc] initWithFrame:CGRectMake(40, 100, 300, 50)];
self.view.backgroundColor = [UIColor orangeColor];
textField.backgroundColor =[UIColor whiteColor];
textField.delegate = self;
textField.placeholder = @"请输入密码";
textField.secureTextEntry = YES;
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.clearButtonMode = UITextFieldViewModeAlways;
//设置return的文字
textField.returnKeyType = UIReturnKeyDone;
[self.view addSubview:textField];
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
NSLog(@"将开始编辑");
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
NSLog(@"将要结束编辑");
return YES;
}
测试发现就算是我禁止了系统键盘,单独留下搜狗输入法时,确是弹出系统输入法而不是搜狗输入法。当注释掉textField.delegate = self;时,弹出来的是搜狗输入法。由此感觉是第二种猜测肯能是对的。
当我把textField.delegate = self;更换到[self.view addSubview:textField];之后时刚刚那种奇怪的现象没了,就能够在禁止了系统输入法时直接调用搜狗输入法。
监听键盘的四个通知分别为UIKeyboardWillShowNotification、UIKeyboardDidShowNotification、UIKeyboardWillHideNotification、UIKeyboardDidHideNotification,但是没有源码也就不方便进一步的测试了。但是通过这四个通知应该是能更加具体的找出问题所在。比如:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willShowNotification:) name:@"UIKeyboardWillShowNotification" object:nil];
- (void)willShowNotification:(NSNotification*)note {
NSLog(@"willShowNotification");
}
容易多想,让各位见笑了。若有不足之处,还望指正,非常感谢。