触摸
UITextField
后,键盘大约需要 3-4 秒才会弹出。这只发生在应用程序启动后第一次弹出键盘时,之后动画立即开始。
起初我以为是加载太多图像的问题,或者是我的
UITableView
的问题,但我刚刚创建了一个全新的项目,只有一个UITextField
,而且我仍然遇到这个问题。我使用的是 iOS 5、Xcode 版本 4.2,并在 iPhone 4S 上运行。
这是我的代码:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 280, 30)];
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.delegate = self;
[self.view addSubview:textField];
}
@end
这是所有应用程序的常见问题吗?
现在,我可以让它变得更好的唯一方法是让
textField
成为/辞去 viewDidAppear
中的第一响应者,但这并不能完全解决问题 - 它只是在视图加载时加载延迟。如果我在视图加载时立即单击 textField
,我仍然会遇到问题;如果我在视图加载后等待 3-4 秒再触摸文本字段,则不会出现延迟。
在实施任何奇特的黑客方法来解决此问题之前,请尝试以下操作:停止调试会话,从多任务处理中关闭应用程序,从计算机上拔下设备,然后通过点击其图标正常运行应用程序。我至少见过两种情况,其中延迟仅在设备插入时发生。
所以问题并不像我之前想象的那样仅限于第一次安装,而是每次启动应用程序时都会发生。这是我的解决方案,可以完全解决该问题。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Preloads keyboard so there's no lag on initial keyboard appearance.
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
}
是的,我在最新的 iPhone 4s 上也遇到了几秒钟的延迟。不要恐慌。由于某些原因,只有在第一次从 Xcode 中以“调试”方式加载应用程序时才会发生这种情况。当我发布时,我没有得到延迟。就忘了吧...
您可以在 Swift 中使用 Vadoff 的解决方案,将其添加到 didFinishLaunchingWithOptions 中:
// Preloads keyboard so there's no lag on initial keyboard appearance.
let lagFreeField: UITextField = UITextField()
self.window?.addSubview(lagFreeField)
lagFreeField.becomeFirstResponder()
lagFreeField.resignFirstResponder()
lagFreeField.removeFromSuperview()
它在 iOS 8 中对我有用。
块中的代码添加到主队列并异步运行。 (不要锁定主线程)
dispatch_async(dispatch_get_main_queue(), ^(void){
[textField becomeFirstResponder];
});
这个bug似乎在iOS 9.2.1中得到了修复。自从升级我的设备后,当我的设备连接到计算机时,点击文本字段和出现的键盘之间不再有延迟。
此问题在 2024 年仍然与 Xcode 版本:15.3 和 Swift 版本:5.10 相关。
此问题仅在调试时出现。关闭设备中的应用程序并手动重新打开它(而不是通过从 Xcode 运行)。这个问题已经解决了。
您可以在 viewController 的视图加载时添加以下代码,例如 viewDidAppear。不仅仅是 application:didFinishLaunchingWithOptions:
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];