UITextField获取当前编辑的单词

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITextField获取当前编辑的单词相关的知识,希望对你有一定的参考价值。

我正在研究一个自动完成组件,我有一个问题,我想以一些简单的方式解决。

我想支持编辑自动填充文本,例如:

 blablabl @usertag blablabl

如果用户返回并编辑@usertag字符串,我想在编辑时启动自动完成功能。

问题是,如何从文本字段中获取当前编辑的单词。我想到了光标位置,用“”(空格)分隔nsstring到字,并从第一个字到光标位置计数字母。

有没有更简单的方法呢?

答案

好的,我找到了一种很容易做到的方法。也许有人会发现它很有用:

UITextRange* selectedRange = [textField selectedTextRange];
NSInteger cursorOffset = [textField offsetFromPosition:0 toPosition:selectedRange.start];
NSString* text = textField.text;
NSString* substring = [text substringToIndex:cursorOffset];
NSString* editedWord = [[substring componentsSeparatedByString:@" "] lastObject];
另一答案

Swift 4解决方案

   func getCurrentEditingWord() ->String? {
        let selectedRange: UITextRange? = self.textView.selectedTextRange
        var cursorOffset: Int? = nil
        if let aStart = selectedRange?.start {
            cursorOffset = self.textView.offset(from: self.textView.beginningOfDocument, to: aStart)
        }
        let text = self.textView.text
        let substring = (text as NSString?)?.substring(to: cursorOffset!)
        let editedWord = substring?.components(separatedBy: " ").last
        return editedWord
    }
另一答案

您是否尝试过使用UITextFieldDelegate可用的方法?如果您在编辑单词时访问该单词是您想要的,您可以简单地使用-textField:shouldChangeCharactersInRange:replacementString:。在此方法中,您可以访问输入的字符串,并且您还可以在此处为输入的每个新字符执行任何字符串操作。

另一答案

这是效率书呆子的解决方案。用Swift 4.2编写。我声称它更有效,因为其他答案正在调用String方法String.component,它不必要地将整个子字符串转换为数组。这些解决方案总是在光标之前抓取单词,这可能不一定是当前单词。

extension UITextView {
    /// Returns the current word that the cursor is at.
    func currentWord() -> String {
        guard let cursorRange = self.selectedTextRange else { return "" }
        func getRange(from position: UITextPosition, offset: Int) -> UITextRange? {
            guard let newPosition = self.position(from: position, offset: offset) else { return nil }
            return self.textRange(from: newPosition, to: position)
        }

        var wordStartPosition: UITextPosition = self.beginningOfDocument
        var wordEndPosition: UITextPosition = self.endOfDocument

        var position = cursorRange.start

        while let range = getRange(from: position, offset: -1), let text = self.text(in: range) {
            if text == " " || text == "
" {
                wordStartPosition = range.end
                break
            }
            position = range.start
        }

        position = cursorRange.start

        while let range = getRange(from: position, offset: 1), let text = self.text(in: range) {
            if text == " " || text == "
" {
                wordEndPosition = range.start
                break
            }
            position = range.end
        }

        guard let wordRange = self.textRange(from: wordStartPosition, to: wordEndPosition) else { return "" }

        return self.text(in: wordRange) ?? ""
    }
}

以上是关于UITextField获取当前编辑的单词的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面控件中获取当前显示的 UItextField 的实例

Android 使用两个不同的代码片段获取当前位置 NULL

UITextField 起始光标位置错误

如何获取当前显示的片段?

如何从 UITextField Delegate 获取当前输入的文本? [复制]

没有使用 navController.currentDestination?.id 获取当前片段 ID