我正在实施类似于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
以下解决方案无法解决问题。它将返回文本字段中的所有文本,而不仅仅是正在键入的单词。
答案 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
}
您还需要在您提供的代码段中将文字视图的文字分配给您的变量:
} else {
var word = postView.textView.text
self?.displayedFriends = (self?.displayedFriends.filter { ($0["firstName"]?.hasPrefix(word))! })!
}