Как избежать разделения слова на два UITextViews - PullRequest
2 голосов
/ 20 мая 2011

Полагаю, это немного неловкий вопрос, поэтому позвольте мне перефразировать его с помощью иллюстрации: enter image description here

У меня есть UITextView, который ограничен определенным количеством символов.Это регулярно проверяется с - (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString *)aText.Когда текст превышает пороговое значение (на иллюстрации это будет 8 символов), приложение переходит к следующему текстовому представлению и копирует следующий введенный символ (в данном случае p) в новый UITextView.Затем пользователь может ввести оставшуюся часть слова (в данном случае py).

Вместо того, чтобы разбивать слово на два UITextViews, я бы хотел, чтобы все слово «happy» было в следующем UITextView.Другими словами, мне нужно скопировать «hap» из строки 1 в начало строки 2, а затем удалить «hap» из строки 1.

Я придумал этот код, который проверяет строку 1 на наличие пробелов икопирует все после пробела в строку 2. Но это не сработает:

NSLog(@"text of current string: %@", aTextView.text);           // e.g. "I am hap"
         NSLog(@"chars in aTextView.text: %i", aTextView.text.length);  // e.g. 8 chars
         NSLog(@"text for next string: %@ ", aText);                    // e.g. "py"

         NSString *aTextModified = aText;

         for (int i = aTextView.text.length; i > 0; i--) {

             NSLog(@"I currently check: '@%'", [aTextView.text characterAtIndex:i]);

             if ([[aTextView.text characterAtIndex:i] isEqualToString:@" "]) {
                 // job done
             } else {
                 NSLog(@"I add %@ infront of %@", [aTextView.text characterAtIndex:i], aText);
                 aTextModified = [NSString stringWithFormat:@"%@%@", [aTextView.text characterAtIndex:i], aText];
                 NSLog(@"I delete %@ as I have put it into the next string...", [aTextView.text characterAtIndex:i]);
                 [aTextView.text characterAtIndex:i] = @"";
             }
         }

XCode выдает предупреждение «Недопустимый тип получателя« unichar »для строки if ([[aTextView.text characterAtIndex:i] isEqualToString:@" "]).Я полагаю, я не использую characterAtIndex, верно?Разрешено ли мне применять это к тексту (который должен быть UIString) в UITextView?

Кроме того, я получаю сообщение об ошибке «Требуется LValue как левый операнд присваивания» для последней строки [aTextView.text characterAtIndex:i] = @""; СноваДумаю, я не совсем понимаю, как получить доступ к символу в UITextView и изменить его.

Буду очень признателен за любые предложения о том, как сделать это правильно, и если есть более простые способыдобиться того, что я пытаюсь сделать.

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Мало вещей

NSLog(@"I currently check: '@%'", [aTextView.text characterAtIndex:i]);

Здесь вы получите символ C, поэтому вместо него следует использовать %c.

[[aTextView.text characterAtIndex:i] isEqualToString:@" "]

Опять же, здесь вы отправляете сообщение на символ C, что неверно. Вы можете изменить его на [aTextView.text characterAtIndex:i] == " ", чтобы сделать это правильно.

[aTextView.text characterAtIndex:i] = @"";

text определяется как неизменяемая строка. Вы не можете изменить это так. Вам нужно будет объявить изменяемую строку и скопировать содержимое text. После внесения изменений в изменяемую строку вы можете установить ее на text.

Это также даст вам последнее слово.

NSScanner *wordsScanner = [NSScanner scannerWithString:@"I am happy however I want the last word and it's positions !!!!"];
NSString *theLastWord;
while (![wordsScanner isAtEnd]) {
    [wordsScanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] intoString:&theLastWord];
}

// theLastWord has the value.

EDIT

NSString *text = aTextView.text;
int index = text.length - 1;
while ([text characterAtIndex:index] != " ") {
    index--;
}

NSString stringToBeMoved = [text substringFromIndex:index];
aTextView.text = [text substringToIndex:(index+1)];
1 голос
/ 20 мая 2011

Хорошо, давайте начнем с простого.Я создал следующее регулярное выражение, которое будет соответствовать последнему слову в строке, и, если есть символы, не являющиеся словами, такие как пробелы или знаки препинания.

Я думаю, что легче работать с регулярным выражением и определить, гдеэто соответствует, чтобы манипулировать строкой.Однако я не уверен, как производительность будет в больших текстах, но я думаю, что это можно решить, используя некоторые предположения, такие как: textview, который не будет пропущен в пределах первых 1000 символов, так что может быть безопасно использовать только последние 50 символов дляthe regex.

NSString *aString = @"I am happy however I want the last word and it's positions !!!!";

NSString * const regularExpression = @"\\b(\\w+)\\b(\\W*)$";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regularExpression
                                                                       options:NSRegularExpressionCaseInsensitive | NSRegularExpressionUseUnicodeWordBoundaries
                                                                         error:&error];

NSArray *matches = [regex matchesInString:aString
                                  options:0
                                    range:NSMakeRange(0, [aString length])];

for (NSTextCheckingResult *match in matches) {
    for (int i = 0; i < [match numberOfRanges]; i++) {
        NSLog(@"substring %d: %@", i, [aString substringWithRange:[match rangeAtIndex:i]]);
    }
}

Если он совпадает, вы можете легко перебрать результат, который даст вам последнее слово и некоторые завершающие несловные символы, но самое главное, чтобы вы получили диапазон каждого соответствия, чтобы вы моглиопределить, пересекается ли порог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...