在 UITextView 中的一行中退格多个字符

Posted

技术标签:

【中文标题】在 UITextView 中的一行中退格多个字符【英文标题】:Backspace many characters in a row in a UITextView 【发布时间】:2013-02-05 05:51:31 【问题描述】:

我想检查用户是否在 textView 中退格了一个字符,是否有任何相同的字符连接它以将它们全部删除...

例如,如果我要检查的字符是“e”,我有文本“easy heeeeeello”并且用户开始按退格键,它将变成:

easy heeeeeello -> easy heeeeeell -> easy heeeeeel -> easy heeeeeee -> easy h

代码应该检测到按下了退格键。 然后它将检测哪些文本将被删除,如果该文本是一个字符(在我们的例子中是“e”),它将检查是否有更多的“e”接触到“e”,从而创建了一个“e”链s 并将它们全部删除。

你能帮帮我吗?

【问题讨论】:

【参考方案1】:

好的,所以我写了这段代码,它对我有用

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
    if([text isEqualToString:@""]) 
    //Detected backspace character as the new character is @"" meaning something will be deleted

        char toDelete = [textView.text characterAtIndex:range.location];

        int duplicateCharCount = 0;
        for(int i =range.location-1; i>=0; i--) 

            if([textView.text characterAtIndex:i] == toDelete) 
                duplicateCharCount++;
             else 
                break;
              
        

        NSRange newRange = NSMakeRange(0, range.location - duplicateCharCount);
        [textView setText:[textView.text substringWithRange:newRange]];

        return NO;
     else 
        return YES;
    

我知道这不是最好的实现,但现在你知道如何继续了

希望对你有帮助

【讨论】:

非常好!非常感谢!我之前从未真正在 for 循环中使用过中断,所以起初我很困惑为什么这段代码有效并且没有删除字符串中的所有 e,但现在我明白了!【参考方案2】:

有点好玩,所以我刚刚写了代码。 代码有效。

首先,我们应该设置 UITextView 的委托并响应。

textView:shouldChangeTextInRange:replacementText:

根据document,

如果用户按下 Delete 键,则范围的长度为 1,并且一个空字符串对象替换该单个字符。

所以代码如下:

#pragma mark - 
#pragma mark - UITextView Delegate

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

    static NSString *suffix = @"e";

    if (range.length == 1 && [text length] == 0) 
        // The user presses the Delete key.
        NSString *currentText = [textView.text substringToIndex:range.location+1];
        NSString *appendingText = [textView.text substringFromIndex:range.location+1];

        if ([currentText hasSuffix:suffix]) 
            NSRange range = [self inverseRangeOfString:currentText withSuffix:suffix];
            currentText = [currentText stringByReplacingCharactersInRange:range withString:@""];

            textView.text = [currentText stringByAppendingString:appendingText];

            return NO;
        
    

    return YES;


- (NSRange)inverseRangeOfString:(NSString *)str withSuffix:(NSString *)suffix

    int length = [str length];
    int lastIndex = length - 1;

    int cnt = 0;
    for (; lastIndex >= 0; --lastIndex) 
        NSString *subStr = [str substringFromIndex:lastIndex];
        if ([subStr hasPrefix:suffix]) 
            cnt++;
         else 
            break;
        
    

    NSRange range = (NSRange)++lastIndex, cnt;

    return range;

【讨论】:

很高兴你玩得开心!非常好的代码,感谢您的帮助! :)

以上是关于在 UITextView 中的一行中退格多个字符的主要内容,如果未能解决你的问题,请参考以下文章

无法在使用脚本放置逗号的文本区域中退格

UITextView:输入退格键时字符数不正确

SecureCRT远程连接Linux下的sqlplus中退格键不能使用之解决方法

如何允许 uitextview 只接受退格键和删除键

自 iOS 7 中的删除(退格)操作以来,我如何才能不接收 UITextView 委托消息?

在Python中保留退格键时删除多个字符