5

UITextViewからユーザーが入力した最新の単語を取得したい。

ユーザーは、UITextViewの任意の場所、途中、最後、または最初に単語を入力できます。ユーザーが入力を終えてスペースを押し、「からの提案」を使用して修正を行うと、それは単語と見なされますUIMenuController

UITextView例:ユーザーがテキストの途中のどこかに「kimd」と入力すると、自動修正「kind」のポップアップが表示されます。彼がそれをした後、私は「種類」をキャプチャして、それを私のアプリケーションで使用したいと思います。

私はインターネットでたくさん検索しましたが、ユーザーが最後にテキストを入力したときに話し合う解決策を見つけました。また、スペースを検出し、テキストが見つかった後、別のスペースが見つかるまで逆方向検索を実行して、単語として修飾できるようにしました。しかし、私はこれを行うためのより良い方法があるかもしれないと思います。

iOSがテキストフィールドまたはテキストビューに入力した最近のテキストをキャッシュすることをどこかで読んだことがあります。私が一番上のものを飛び出すことができれば、それが私が望むすべてです。そのオブジェクトへのハンドルが必要です。

私は本当に助けていただければ幸いです。

注:ユーザーはUItextviewのどこにでもテキストを入力できます。最近入力した単語が必要です

ありがとう。

4

4 に答える 4

3
//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]; 
}
}
于 2013-01-10T15:05:34.697 に答える
2

これが私が提案することです、少しハッキーに見えるかもしれませんが、それはうまくいくでしょう:

最初に.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!
}

}
于 2012-12-29T19:36:53.433 に答える
1

このコードを使用して、@記号の背後にある単語を取得します。

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

        }
    }
}
于 2012-12-30T13:46:08.720 に答える
1

の単純な拡張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!
    }
}
于 2016-01-04T15:54:14.600 に答える