【问题标题】:UITEXTVIEW: Get the recent word typed in uitextviewUITEXTVIEW:获取最近在 uitextview 中输入的单词
【发布时间】:2012-12-29 19:12:15
【问题描述】:

我想从 UITextView 获取用户最近输入的单词。

用户可以在 UITextView 的任意位置输入单词,可以在中间或者结尾或者开头。当用户完成输入并按下空格并使用“来自UIMenuController 的建议”进行任何更正时,我会认为它是一个词。

示例:用户在文本中间某处的UITextView 中键入“kimd”,他会弹出一个自动更正“种类”的弹出窗口。在他这样做之后,我想捕获“kind”并在我的应用程序中使用它。

我在互联网上进行了很多搜索,但找到了有关用户最终何时输入文本的解决方案。我还尝试检测一个空格,然后进行向后搜索,直到找到一些文本后的另一个空格,这样我就可以将它限定为一个单词。但我认为可能有更好的方法来做到这一点。

我在某处读到 iOS 缓存了我们在文本字段或文本视图中输入的最新文本。如果我能从顶部弹出,这就是我想要的。我只需要处理那个对象。

非常感谢您的帮助。

注意:用户可以在 UItextview 的任何地方输入文本。我需要最近输入的单词

谢谢。

【问题讨论】:

  • 注意:用户可以在 UItextview 的任何地方输入文本。我需要最近输入的单词
  • 没有办法在 iOS 中获取缓存的字符串。这样我们就可以说“object.getTheLastCachedString”或类似的东西。有一个名为 NSCache 的类,它可以帮助我们将数据缓存到其中,但对于这种特殊情况,它可能没有帮助。

标签: objective-c ios uitextview uimenucontroller


【解决方案1】:
//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]; 
}
}

【讨论】:

  • 变量 currentLocation 来自哪里?
  • @RobCaraway range.location
  • newRangeLocation ?
【解决方案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!
}

}

【讨论】:

  • 获取 allWords 中的最后一个对象对我不起作用,因为它总是会获取在文本视图中输入的最后一个单词,而不是最近的单词。我想要用户输入的最新单词。用户可以在任何地方输入它,在文本视图的开始中间或结尾。
  • @MCKapur NP。如果我找到解决方案,我会发布。
  • @NoorSyed 好的,我也有兴趣找到这个
  • @NoorSyed 你最终找到解决方案了吗?
  • 是的,我做到了。将发布它。
【解决方案3】:

我使用这段代码来获取@-符号后面的单词:

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

        }
    }
}

【讨论】:

  • 我将不得不尝试使用您的解决方案。没有办法在iOS中获取缓存的字符串。这样我们就可以说“object.getTheLastCachedString”或类似的东西。
  • 我只知道这个解决方案。
  • self.startOfMention, self.lenthOfMentionSubstring 这些将被分配到哪里
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多