如何在textView

时间:2017-11-15 10:03:36

标签: ios swift uitableview autocomplete textview

我有一个textView,用户可以在其中添加评论并提及其他用户。 我构建了一个在用户输入符号“@”时触发的函数。 所以基本上在Instagram或Facebook中,当用户键入“@”时,会出现一个tableview并显示用户建议。 这是我的功能:

func suggestUser() {
    if let searchText = postTextField.text {
        let words = searchText.components(separatedBy: .whitespacesAndNewlines)
        for var word in words {
            if word.hasPrefix("@") {
                word = word.trimmingCharacters(in: .punctuationCharacters)
                let userToSearch = String(word.dropFirst())
                self.viewContainerForTableView.isHidden = false
                self.suggestedUsers.removeAll()
                self.tableView.reloadData()
                Api.User.queryUsersByMentionName(WithText: userToSearch, completion: { (user) in
                    if !self.suggestedUsers.contains(where: { $0.id == user.id }) {
                        self.suggestedUsers.append(user)
                    }
                    self.tableView.reloadData()
                })
            } else {
                self.viewContainerForTableView.isHidden = true
            }
        }
    }
}

我有两个问题: 1)当用户点击tableview中的建议用户时,如何删除他已输入的文本并添加他选择的文本? 让我举个例子:

如果用户在tableView中键入@jan,则显示janedoe。当用户在表格视图中单击建议的名称时,如何删除jan并添加janedoe?

这是我的didSelectRowAt

的代码
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let username = suggestedUsers[indexPath.row].username
    let usernameToAppend = username.components(separatedBy: .whitespacesAndNewlines).joined()
     postTextField.text.append("\(usernameToAppend)")
}

2)有没有办法检查用户是否已在textView中输入,因此不在tableview中显示?

谢谢!

1 个答案:

答案 0 :(得分:1)

经过一整天的尝试,我想我找到了一个解决方案......希望......

所以我为textView创建了一个扩展名:

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

然后在我的didSelectRow中我有:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let username = suggestedUsers[indexPath.row].username
    let usernameToAppend = username.components(separatedBy: .whitespacesAndNewlines).joined()
    let currentWord = postTextField.currentWord
    if currentWord != nil && currentWord != "@"  {
        if let countIndex = currentWord?.count {
            let count = Int(countIndex)
            let startPosition = postTextField.selectedTextRange?.start
            let endPosition = postTextField.position(from: startPosition!, offset: -count)
            postTextField.selectedTextRange = postTextField.textRange(from: startPosition!, to: endPosition!)
            if let range = postTextField.selectedTextRange {
                postTextField.replace(range, withText: usernameToAppend)
            }
        }
    } else if currentWord == "@" {
        if let range = postTextField.selectedTextRange {
            if range.start == range.end {
                postTextField.replace(range, withText: usernameToAppend)
            }
        }
    }
  }
}