Как изменить цвет слова, которое было заменено

#ios #objective-c #string #colors #uitextview

#iOS #objective-c #строка #Цвет #uitextview

Вопрос:

Подумайте о проверке грамматики. Если я введу «Я должен был знать, что шоу было сегодня». это превратит его в «Я должен был знать, что это было сегодня». Существует приложение для проверки грамматики, которое окрасит заменяемую часть в красный цвет. Я хочу знать, как это сделать.

ПРЕЖДЕ чем вы свяжете меня с каким-либо другим вопросом, я видел их, и все они говорят о диапазоне. Для диапазона требуется определенное количество символов, которые необходимо вставить, но вы можете видеть, насколько это проблема, когда у вас более 100 фраз, которые изменились бы, если бы они были исправлены. Я продолжаю видеть NSMutableString, но у него также есть диапазон.

Например, вот код, который превращает вводимый пользователем (что бы он ни вводил) в строку.

 NSString *input = _inputTextView.text;
  

И вот пример слова, которое изменяется.

 inpput = [input stringByReplacingOccurencesOfString:@"(?wi)\bshould of\b" withString:@"should have" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];
  

И это код, который отображает исправленную строку в другом UITextView:

 _outputTextView.text = input;
  

Например:
Ввод пользователя: я должен был пойти в магазин.
Вывод: я должен был пойти в магазин.

В принципе, самым простым из возможных способов, есть ли код, который я могу поместить внутри [] в приведенный выше код, чтобы изменить цвет? Например, параметры: цвет: или что-то еще?

Ответ №1:

Это меня заинтересовало, поэтому я быстро нашел для этого решение.

Я протестировал это, и, похоже, оно работает довольно хорошо. Вам нужно использовать приписываемые строки, чтобы сохранить атрибуты цвета.

 // define what you want to replace and what you want to replace it with
NSString *stringToReplace = @"(?wi)\bshould of\b";
NSString *newString = @"should have";

// get a mutable attributed string so that the color can be used as an attribute
NSMutableAttributedString *attributedInput = _inputTextView.attributedText.mutableCopy;

NSRange rangeToReplace;

do
{
    // check for occurrence
    rangeToReplace = [[attributedInput string] rangeOfString:stringToReplace options:NSRegularExpressionSearch];
    if(rangeToReplace.location != NSNotFound)
    {
        // create the range we're going to color
        NSUInteger locationToBeReplaced = rangeToReplace.location;
        NSUInteger replacedLength = newString.length;
        NSRange rangeToAddAttribute = NSMakeRange(locationToBeReplaced, replacedLength);

        // replace old string
        [attributedInput replaceCharactersInRange:rangeToReplace withString:newString];

        // color new string
        [attributedInput addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:rangeToAddAttribute];
    }
}
while(rangeToReplace.location != NSNotFound); // continue until all occurrences have been replaced
  

Комментарии:

1. Я попытался реализовать это, но оно продолжало зависать и не работало. Я попробовал это в новом файле, и он ничего не делает.

2. Вот очень простая рабочая реализация, которую я собрал: cl.ly/2m180W3F323h Просто распакуйте его и запустите.

3. Это довольно аккуратный подход, и он немного отличается от того, о чем я думал. Большое спасибо! Теперь мне нужно реализовать его в 2 разных UITextViews. В первом текстовом представлении будет показана обычная фраза, а во втором — новая фраза. Еще раз большое спасибо!