UITableViewCell 中的 UITextView,如何在 tableView 滚动时退出 textview 的 firstResponder?

UITextView inside a UITableViewCell, how to resign textview's firstResponder when tableView scrolls?

我创建了一个自定义 UITableViewCell,并将 UITextView 放入此原型单元格中。当我点击这个 textView 时,键盘会自动弹起。但是,如果我想隐藏键盘,则必须单击 Return 键。不太方便。

这是问题。 当我滚动 tableview 时,如何退出 textView 的 firstResponder 以隐藏键盘。

cellForRowAtIndex方法如下

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()
    if(indexPath.section == 0){
        cell = self.tableView.dequeueReusableCellWithIdentifier("InputCell")!
        let textView = cell.viewWithTag(102) as! UITextView
        textView.editable = true
        textView.keyboardType = UIKeyboardType.Default
        textView.delegate = self
        textView.targetForAction(#selector(FeedBackViewController.getTextViewInsideCell(_:)), withSender: textView)
    }
    if(indexPath.section == 1){
        cell = self.tableView.dequeueReusableCellWithIdentifier("ConfirmButtonCell")!
        let label = cell.textLabel
        label?.text = "send"
        label?.textAlignment = NSTextAlignment.Center
        label?.textColor = UIColor.redColor()
    }
    return cell
}

以下是我实现的一些方法。

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool{
    if(text == "\n"){
        textView.resignFirstResponder()
        return false
    }
    return true
}

而且我不知道如何实现这个方法。

func scrollViewWillBeginDragging(scrollView: UIScrollView) {

}

您可以尝试在 viewDidLoad 上实现它,它会在 tableview 开始拖动时自动关闭键盘:

tableView.keyboardDismissMode = .Interactive.OnDrag

UITableView继承自UIScrollView,符合UIScrollViewDelegateProtocol。尝试从中覆盖 scrollViewDidScroll 函数并从 textview 中退出第一响应者。

一定要把tableView的delegate分配给你的view controller,然后添加下面的代码

func scrollViewDidScroll(scrollView: UIScrollView) {
    yourTextView.resignFirstResponder()
}  

根据docs scrollViewDidScroll

Tells the delegate when the user scrolls the content view within the receiver.

更新

另一种退出第一响应者的方法是将 endEditing 设置为 true 以供您查看:

Causes the view (or one of its embedded text fields) to resign the first responder status.

func scrollViewDidScroll(scrollView: UIScrollView) {
    self.view.endEditing(true)
} 

这很容易你也可以用故事板做同样的事情

打开故事板

select 表视图或集合视图

和 select 拖动