【问题标题】:UITextView inside a UITableViewCell, how to resign textview's firstResponder when tableView scrolls?UITableViewCell内的UITextView,tableView滚动时如何退出textview的firstResponder?
【发布时间】:2016-12-28 23:00:53
【问题描述】:

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

问题来了。 当我滚动表格视图时,如何退出 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) {

}

【问题讨论】:

  • self.view.endEditing(true) 在您的scrollViewWillBeginDragging 中将完成这项工作。

标签: ios swift uitableview uitextview first-responder


【解决方案1】:

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

tableView.keyboardDismissMode = .Interactive.OnDrag

【讨论】:

    【解决方案2】:

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

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

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

    根据docsscrollViewDidScroll

    当用户在接收器中滚动内容视图时通知代理。

    更新

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

    使视图(或其嵌入的文本字段之一)放弃第一响应者状态。

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

    【讨论】:

    • 他将如何访问 tableViewCell 内的 textView 实例?
    • 谢谢!我也试过了,但是这样,我无法在单元格内获取textViewyourTextView并退出。
    • @EvgenyKarkan 我希望您不会展示一种方法,该方法从 IndexPath 获取单元格实例然后访问其子视图?更简单的解决方案是在滚动方法中调用self.view.endEditing(true)
    • 顺便说一句,第一个答案已经解决了我的问题。也谢谢你的建议~
    • @NSNoob 完全正确 - 这是我结束编辑的第二个提示 :)
    【解决方案3】:

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

    打开故事板

    选择表格视图或集合视图

    并选择拖动

    【讨论】:

    • 谢谢!和第一个答案一样~
    • 这有点不同@MangoRyan,他回答以编程方式进行,我在情节提要中向您展示:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多