UITEXTVIEW: получить последнее слово, введенное в uitextview

Я хочу получить последнее слово, введенное пользователем, из UITextView.

Пользователь может ввести слово в любом месте UITextView, в середине, в конце или в начале. Я бы посчитал это словом, когда пользователь заканчивает вводить его, нажимает пробел и вносит какие-либо исправления, используя «Предложения от UIMenuController».

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

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

Я где-то читал, что iOS кэширует последний текст, который мы вводим в текстовое поле или текстовое представление. Если я смогу снять верхнюю, это все, что я хочу. Мне просто нужен дескриптор этого объекта.

Я был бы очень признателен за помощь.

Примечание. Пользователь может вводить текст в любом месте UItextview. Мне нужно последнее введенное слово

Спасибо.


person Noor Syed    schedule 29.12.2012    source источник
comment
Примечание. Пользователь может вводить текст в любом месте UItextview. Мне нужно последнее введенное слово   -  person Noor Syed    schedule 30.12.2012
comment
Нет способа получить кешированные строки в iOS. Таким образом, мы можем просто сказать object.getTheLastCachedString или что-то в этом роде. Существует класс под названием NSCache, который помогает нам кэшировать в него данные, но в этой конкретной ситуации он может быть бесполезен.   -  person Noor Syed    schedule 31.12.2012


Ответы (4)


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

Сначала в .h согласуйте с UITextViewDelegate и установите delegate в текстовом представлении self следующим образом:

myTextView.delegate = self;

и используйте этот код:

- (void)textViewDidChange:(UITextView *)textView { // Delegate method called when any text is modified

if ([textView.text substringFromIndex: [textView.text length] - 1]) { // Gets last character of the text view's text

    NSArray *allWords = [[textView text] componentsSeparatedByString: @" "]; // Gets the text view's text and fills an array with all strings seperated by a space in text view's text, basically all the words

    NSString *mostRecentWord = [allWords lastObject]; // The most recent word!
}

}
person MCKapur    schedule 29.12.2012
comment
Получение последнего объекта в allWords не сработает для меня, потому что он всегда будет получать последнее слово, введенное в текстовом представлении, а не обязательно самое последнее слово. Мне нужно самое последнее слово, введенное пользователем. Пользователь может ввести его где угодно, в начале, середине или конце текстового представления. - person Noor Syed; 30.12.2012
comment
@MCKapur NP. Я отправлю сообщение, если найду решение. - person Noor Syed; 31.12.2012
comment
@NoorSyed Хорошо, мне тоже интересно это найти - person MCKapur; 31.12.2012
comment
@NoorSyed Вы в конце концов нашли решение? - person MCKapur; 07.01.2013
comment
Да, я сделал. Буду размещать это. - person Noor Syed; 08.01.2013
comment
@MCKapur NP. Я опубликовал свое решение. - person Noor Syed; 10.01.2013
comment
@MCKapur сначала внимательно прочтите вопрос. В вопросе конкретно упоминалось, что текст можно редактировать из любой позиции внутри UITextView - person ; 21.05.2017

Я использую этот код, чтобы получить слово за знаком @:

- (void)textViewDidChange:(UITextView *)textView {
    NSRange rangeOfLastInsertedCharacter = textView.selectedRange;
    rangeOfLastInsertedCharacter.location = MAX(rangeOfLastInsertedCharacter.location - 1,0);
    rangeOfLastInsertedCharacter.length = 1;
    NSString *lastInsertedSubstring;
    NSString *mentionSubString;
    if (![textView.text isEqualToString:@""]) {
        lastInsertedSubstring = [textView.text substringWithRange:rangeOfLastInsertedCharacter];
        if (self.startOfMention > 0 || self.startOfHashtag > 0) {
            if ([lastInsertedSubstring isEqualToString:@" "] || (self.startOfMention > textView.selectedRange.location || self.startOfHashtag > textView.selectedRange.location)) {
                self.startOfMention = 0;
                self.lenthOfMentionSubstring = 0;
            }
        }
        if (self.startOfMention > 0) {
            self.lenthOfMentionSubstring = textView.selectedRange.location - self.startOfMention;
            NSRange rangeOfMentionSubstring = {self.startOfMention, textView.selectedRange.location - self.startOfMention};
            mentionSubString = [textView.text substringWithRange:rangeOfMentionSubstring];
            dhDebug(@"mentionSubString: %@", mentionSubString);

            UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);

        }
    }
}
person dasdom    schedule 30.12.2012
comment
Мне нужно было бы попробовать ваше решение. Нет способа получить кешированные строки в iOS. Таким образом, мы можем просто сказать object.getTheLastCachedString или что-то в этом роде. - person Noor Syed; 31.12.2012
comment
Я знаю только это решение. - person dasdom; 31.12.2012
comment
где self.startOfMention, self.lenthOfMentionSubstring они будут назначены - person Mubin Mall; 12.04.2017

Простое расширение для UITextView:

extension UITextView {

    func editedWord() -> String {

        let cursorPosition = selectedRange.location
        let separationCharacters = NSCharacterSet(charactersInString: " ")

        let beginRange = Range(start: text.startIndex.advancedBy(0), end: text.startIndex.advancedBy(cursorPosition))
        let endRange = Range(start: text.startIndex.advancedBy(cursorPosition), end: text.startIndex.advancedBy(text.characters.count))

        let beginPhrase = text.substringWithRange(beginRange)
        let endPhrase = text.substringWithRange(endRange)

        let beginWords = beginPhrase.componentsSeparatedByCharactersInSet(separationCharacters)
        let endWords = endPhrase.componentsSeparatedByCharactersInSet(separationCharacters)

        return beginWords.last! + endWords.first!
    }
}
person Bartłomiej Semańczyk    schedule 04.01.2016

person    schedule
comment
Откуда берется переменная currentLocation? - person Rob Caraway; 14.04.2014
comment
@RobCaraway range.location - person isal; 25.06.2014
comment
newRangeLocation? - person Jaydip; 01.03.2021