質問

I want to get the most recent word entered by the user from the UITextView.

The user can enter a word anywhere in the UITextView, in the middle or in the end or in the beginning. I would consider it a word when the user finishes typing it and presses a space and does any corrections using the "Suggestions from the UIMenuController".

Example: User types in "kimd" in the UITextView somewhere in the middle of text, he gets a popup for autocorrection "kind" which he does. After he does that, I want to capture "kind" and use it in my application.

I searched a lot on the internet but found solutions that talk about when the user enters text in the end. I also tried detecting a space and then doing a backward search until another space after some text is found, so that i can qualify it as a word. But I think there may be better ways to do this.

I have read somewhere that iOS caches the recent text that we enter in a text field or text view. If I can pop off the top one , that's all I want. I just need handle to that object.

I would really appreciate the help.

Note: The user can enter text anywhere in UItextview. I need the most recent entered word

Thanks.

役に立ちましたか?

解決

//This method looks for the recent string entered by user and then takes appropriate action.

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

 //Look for Space or any specific string such as a space
if ([text isEqualToString:@" "]) {
NSMutableCharacterSet *workingSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet]   mutableCopy];

  NSRange newRange = [self.myTextView.text rangeOfCharacterFromSet:workingSet
                                     options:NSBackwardsSearch
                                     range:NSMakeRange(0, (currentLocation - 1))];

 //The below code could be done in a better way...
 UITextPosition *beginning = myTextView.beginningOfDocument;
 UITextPosition *start = [myTextView positionFromPosition:beginning offset:currentLocation];
 UITextPosition *end = [myTextView positionFromPosition:beginning   offset:newRangeLocation+1];
 UITextRange *textRange = [myTextView textRangeFromPosition:end toPosition:start];

 NSString* str = [self.myTextView textInRange:textRange]; 
}
}

他のヒント

Here is what I would suggest doing, might seem a little hacky but it would work just fine:

First in .h conform to the UITextViewDelegate and set your text view's delegate to self like this:

myTextView.delegate = self;

and use this code:

- (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!
}

}

I use this code to get the word behind the @-sign:

- (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);

        }
    }
}

Simple extension for 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!
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top