#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. В первом текстовом представлении будет показана обычная фраза, а во втором — новая фраза. Еще раз большое спасибо!