很多人一直说这是一个错误,但由于这个问题仍然存在于通用汽车中,我开始认为这可能是逻辑上的变化。话虽如此,我为我的应用程序编写了这段代码,并在 iOS 7-8 上对其进行了测试。
将以下方法添加到您的UITextField
子类。
- (BOOL)keyboardInputShouldDelete:(UITextField *)textField {
BOOL shouldDelete = YES;
if ([UITextField instancesRespondToSelector:_cmd]) {
BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, UITextField *))[UITextField instanceMethodForSelector:_cmd];
if (keyboardInputShouldDelete) {
shouldDelete = keyboardInputShouldDelete(self, _cmd, textField);
}
}
BOOL isIos8 = ([[[UIDevice currentDevice] systemVersion] intValue] == 8);
BOOL isLessThanIos8_3 = ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.3f);
if (![textField.text length] && isIos8 && isLessThanIos8_3) {
[self deleteBackward];
}
return shouldDelete;
}
这段代码稍微位于私有 API 的红线之前,但是您使用它应该没有问题。我的带有此代码的应用程序位于应用程序商店中。
解释一下,我们调用此方法的超级实现以避免丢失代码。之后我们要打电话-deleteBackward
如果没有文字并且iOS版本在8-8.2之间。
EDIT: 2015 年 1 月 22 日
将其子类化也可能会有所帮助-deleteBackward
你的子类的方法UITextField
。这修复了一些条件错误。其中之一是如果您使用自定义键盘。这是该方法的一个示例。
- (void)deleteBackward {
BOOL shouldDismiss = [self.text length] == 0;
[super deleteBackward];
if (shouldDismiss) {
if ([self.delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""];
}
}
}
EDIT: 2015 年 4 月 13 日
正如 @Gee.E 评论的那样,iOS 8.3 已经解决了这个问题。代码已更新以反映更改。