获取正在键入的单词

时间:2017-06-02 07:38:22

标签: swift

我正在实施类似于Facebook的标记功能。因此,当我键入@及其后的某些字符时,该函数应返回键入的单词。 因此,如果textView包含(并且光标位于 c

Hello @Jac!

该功能应该返回" @ Jac"

如果它包含(并且光标位于 a

Hello @Ja!

然后该函数应返回" @ Ja"

两个例子的最后一个字符串是, 你好杰克!

我尝试了多种解决方案,但没有一种解决方案。一个特别的问题与我的问题非常相似,但解决方案有错误。 Here是链接。

更新1

以下是我在textView上设置委托的方法,

postView.textView.delegate = self

这是用于检测@字符是否被点击的代码(显示朋友列表表,如果是)

if let text = self?.characterBeforeCursor() {
    if (text == "@" && self?.friends.count != 0) {
        self?.friendTableView.isHidden = false
    } else {
        var word // Need to get the word being typed
        self?.displayedFriends = (self?.displayedFriends.filter { ($0["firstName"]?.hasPrefix(word))! })!
    }
}

更新2

以下解决方案无法解决问题。它将返回文本字段中的所有文本,而不仅仅是正在键入的单词。

1 个答案:

答案 0 :(得分:2)

有一个名为shouldChangeCharactersInRange的委托函数。从那里,您可以在用户点击该字母后获取当前文本。

确保在您的班级声明中使用UITextFieldDelegate,并将textField的委托设置为self

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    //get the updated text from the text field like this:
    let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    //note that we *need* to use the text as NSString, because the delegate method gives us an NSRange, rather than a Range which we can't use on String, but NSString, so we need to convert that first

    return true //so the text is visually updated in the textfield
}

修改

我刚看到您发布了UITextView。它几乎一样:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let text = (textView.text as NSString?)?.replacingCharacters(in: range, with: text)

    return true
}

编辑2

您还需要在您提供的代码段中将文字视图的文字分配给您的变量:

} else {
    var word = postView.textView.text
    self?.displayedFriends = (self?.displayedFriends.filter { ($0["firstName"]?.hasPrefix(word))! })!
}