在UITextView

时间:2016-08-16 08:17:52

标签: ios swift uitextview

我正在尝试创建一个“标记窗口”,就像在Facebook中键入“@”一样,它会在您的朋友之间建议标记哪一个。我想在我的应用程序中使用此功能,但我不能为我的生活找出如何获取当前输入的单词以过滤建议。

我使用了UITextView,我一直在看这篇文章https://stackoverflow.com/a/27380612/4148782

但我将此问题转换为Swift 3,即使如此,评论也表明这无法解决。

所以我追求的功能是:

  • 用户开始输入UITextView,如果单词以“@”开头,我想提取单词。
  • 我也想用一定的输入替换这个单词。假设用户输入 @abc ,我过滤了一条说明“ abcdef ”的建议,然后我希望能够替换 @abc 在UITextView中使用“ abcdef ”。

请注意,我希望目前这个词被输入,而不是这个词是最近输入的词。

3 个答案:

答案 0 :(得分:3)

这适合我。

extension UITextView {

var currentWord : String? {

    let beginning = beginningOfDocument

    if let start = position(from: beginning, offset: selectedRange.location),
        let end = position(from: start, offset: selectedRange.length) {

        let textRange = tokenizer.rangeEnclosingPosition(end, with: .word, inDirection: 1)

        if let textRange = textRange {
            return text(in: textRange)
        }
    }
    return nil
   }
}

答案 1 :(得分:1)

像往常一样,我花了相当多的时间试图让这个工作,并且在我发布问题后几分钟我得到了它。所以这里是我使用的代码,但我已弃用let myRange

的调用
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    let myRange = Range<String.Index>(start: textView.text.startIndex, end: textView.text.startIndex.advancedBy(range.location))
    var subString = textView.text.substringWithRange(myRange)
    subString += text

    let wordArray = subString.componentsSeparatedByString(" ")
    if let wordTyped = wordArray.last {
        currentWord = wordTyped
        print("word typed: " + wordTyped)
    }

    return true
}

答案 2 :(得分:0)

快捷键4:

此解决方案在UITextViewDelegate的方法func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool中对我有用。

  func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        guard let textFieldText = textView.text,
              let rangeOfTextToReplace = Range(range, in: textFieldText) else {
                return false
        }

        let currentText = textFieldText.replacingCharacters(in: rangeOfTextToReplace, with: text)
    
        return count <= 150
    }