为什么当在 UITextField 中点击清除按钮时,应用程序仅在 iOS 10 上挂起?

Why is app hanging only on iOS 10 when the clear button is tapped within a UITextField?

我遇到这样一种情况,只有 iOS 10(在 post 时是 10.0 到 10.3)的用户在尝试通过点击清除某些 UITextFields 中的文本时遇到完整的应用程序挂起内置清除按钮。这个问题不会发生在所有的视图控制器中,但它们都共享完全相同的委托实现。这些字段仅用于美国货币输入(数字和小数),并受委托限制为一定数量的字符。

我已经在模拟器中重现了这个挂起,并煞费苦心地确认它不会在 iOS 9.3.5 或更早版本上重现,仅在 iOS 10.0 及更高版本上重现。我已经缩小了这个问题与在 UITextField 委托中设置属性文本集有关的范围。同样,它仅在应用程序中使用某些视图控制器进行重现,而不是全部。但一旦发现重现情况,上述iOS版本测试结果成立。

当按下清除按钮时,只有在通过编辑完成委托路径后,应用程序才会在 iOS SDK 本身的某处进入一个完整的失控循环。我可以单独使用以下示例委托重现它:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    // apply our desired text attributes
    //

    // ensure right justification within the field
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.alignment = NSTextAlignmentRight;

    // set desired fontface, fontsize, color, and field alignment
    NSMutableAttributedString *attributedString = [textField.attributedText mutableCopy];
    [attributedString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Bradley Hand" size:17.0f] range:NSMakeRange(0, [attributedString length])];
    [attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor darkGrayColor] range:NSMakeRange(0, [attributedString length])];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, [attributedString length])];

    // apply the changes in font, size, and color to be visible
    textField.attributedText = attributedString;

    return YES;
}

最奇怪的是,这确实不会发生在所有使用相同委托实现的 UITextField 中,只有一些视图控制器受到影响。其他人使用相同的代码工作得很好

这意味着 UIKit 有一些额外的条件会进入我目前无法确定的这种情况。

找到这个解决方法后,我必须得出结论,这是 iOS 10 SDK 中的一个错误,在某种程度上与我的应用程序中某些视图控制器执行的其他交互有关。

在阅读有关不相关场景的 UITextField 挂起时,我尝试了此 post

中确定的解决方法

更改清除委托以设置提到的 属性 也可以解决我遇到的这种清除属性文本错误情况。

- (BOOL)textFieldShouldClear:(UITextField *)textField {

    // work around iOS 10 bug
    textField.adjustsFontSizeToFitWidth = NO;

    return YES;
}

我不确定为什么这会对问题产生积极影响,因为此应用程序字段中的文本条目始终被委托限制为不超过 5 个字符,故事板中这些字段的宽度是该字段的 6 倍.

我post这是我自己的答案,作为一种经过验证的解决方法,但我正在寻找其他可能避免完全遇到这种情况的答案。