【问题标题】:UITextView delegate method textView:shouldChangeTextInRange:replacementText: gives erroneous replacementText on fast deleteUITextView 委托方法 textView:shouldChangeTextInRange:replacementText: 在快速删除时给出错误的 replacementText
【发布时间】:2012-03-06 20:04:12
【问题描述】:

我有一个 UITextView,我正在将所有文本视图更改事件记录到一个数组中。

当用户快速删除时(按住delete键一次删除一个字而不是一个字符),调用textView:shouldChangeTextInRange:replacementText方法时,range变量的长度只有1,在实际范围应该是单词中删除的字母数。有谁知道这个 Apple Bug 的任何变通方法,以便我可以正确识别 UITextView 中更改的位置和范围以及文本?

【问题讨论】:

    标签: iphone objective-c ios uitextview uitextviewdelegate


    【解决方案1】:

    不,这不是错误。每次您的文本更改时,都会调用此函数。可能您正在使用调试模式并使用键盘退格。它将在到达断点之前生成多个事件。因此,该函数将被多次调用。

    【讨论】:

    • 我正在按屏幕设备键盘上的退格键。每次文本视图更改时都会调用该函数,正确。但是,当用户快速删除并删除了整个单词时,它会被调用一次,但 range.length 仅为 1。您说的是在快速删除中一次删除整个单词, shouldChangeTextInRange 方法应该对于一次删除的整个单词中删除的每个字符被多次调用?
    【解决方案2】:

    正如您在问题中提到的那样,即使删除了整个单词,“范围”也始终为 1。 您必须检查范围“range.length”的长度,这将为您提供从 UITextView 中删除的字符的准确计数。 我有同样的场景,并基于它做了一些工作,它只允许一次删除单个字符而不是整个单词:

    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        if([text isEqualToString:@""]) {
            // Check if length of range being deleted is less than 1 then only delete it
            if (range.length > 1) {
                return NO;
            } else
                return YES;
        } else {
            return YES;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2013-03-02
      相关资源
      最近更新 更多