gpt4 book ai didi

ios - textView :shouldChangeTextInRange:replacementText: returning NO, 但自动更正忽略?

转载 作者:行者123 更新时间:2023-11-29 12:56:15 25 4
gpt4 key购买 nike

我遇到了以下问题,不确定这是 iOS 错误,还是我误解了 UITextViewDelegate 回调。我能够在我的设备(iPad 视网膜)和模拟器上重现此行为仅当我使用软件键盘(即使用我的鼠标单击屏幕键盘)时。

考虑以下人为设计的示例项目(更新于 2014 年 1 月 9 日): https://www.dropbox.com/s/1q3vqfnsmmbhnuj/AutocorrectBug.zip

这是一个简单的 UITextView,将 View Controller 设置为其委托(delegate),并具有以下委托(delegate)方法:

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

if ([text isEqualToString:@" "]
&& range.length == 0
&& (range.location == 0
|| [[textView.text substringWithRange:NSMakeRange(range.location-1, 1)] isEqualToString:@"\n"])) {
textView.backgroundColor = [UIColor yellowColor];
return NO;
}
return YES;
}

我对这段代码的意图是,当用户键入空格(编辑:并且该空格是该行的第一个字符)时,该空格将被忽略,取而代之的是发生一些其他功能,在在这种情况下,UITextView 变为黄色。

现在考虑这些步骤:

  1. 点击 TextView 使其成为第一响应者
  2. 键入“Apple”,按回车键并记下位置
  3. 现在,键入一个空格(将 TextView 变为黄色),再次键入“Apple”并按回车键。

预期:黄色背景和文本阅读:

Apple
Apple

观察到:黄色背景和文本阅读(由于自动更正):

Apple
Apple

似乎自动更正逻辑忽略了 textView:shouldChangeTextInRange:replacementText: 的结果。

  • 这是预期的行为吗?
  • 如果可以,是否可以解决?

编辑 1/9/14:只有一行中的第一个空格应该被忽略,更多的空格应该被正常处理(即插入到文本中),排除空格的蛮力 strip 。此外,我在文本编辑器中处理一个大字符串(可能有数十万个字符)(意味着用户不断输入),因此每次击键时分析整个字符串的性能不会很好。

最佳答案

是的,我在我的 iPad 7.0.3 模拟器上也看到了。

解决它的一种方法是添加此 UITextViewDelegate 方法:

- (void)textViewDidChange:(UITextView *)textView
{
// eliminates spaces, including those introduced by autocorrect
if ([textView.text rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]].location != NSNotFound) {
textView.text = [textView.text stringByReplacingOccurrencesOfString:@" " withString:@""];
}
}

更新

似乎这个委托(delegate)方法在自动更正之后被调用,只是在你想阻止的情况下(“Apple”变成“Apple”)替换文本是“Apple”而不是” “。因此,要修改实现以防止“\n”但允许文本中出现其他“”字符,您可以尝试将 text 的第一个字符与“”进行比较,而不是比较 text 到“”。

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

// compare first character to 'space' character by decimal value
if (text.length && [text characterAtIndex:0] == 32) {

// check if previous character is a newline
NSInteger locationOfPreviousCharacter = range.location - 1;
if (locationOfPreviousCharacter < 0 || [textView.text characterAtIndex:locationOfPreviousCharacter] == 10) {
textView.backgroundColor = [UIColor yellowColor];
return NO;
}
}

return YES;
}

关于ios - textView :shouldChangeTextInRange:replacementText: returning NO, 但自动更正忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21007155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com