首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inputAccessoryView关闭键盘

inputAccessoryView关闭键盘
EN

Stack Overflow用户
提问于 2015-04-24 08:07:28
回答 7查看 3.9K关注 0票数 9

我有一个textView停靠在视图的底部。但是,当用户在commentTextView外部点击时,键盘不会关闭。

当前尝试:

代码语言:javascript
复制
import UIKit
class CommentsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet var commentBar: UIView!

    @IBOutlet var commentTextField: UITextField!

    override var inputAccessoryView: UIView {
        return commentBar
    }

    override func canBecomeFirstResponder() -> Bool {
        commentBar.removeFromSuperview()
        return true
    }

    func textFieldShouldReturn(textField: UITextField!) -> Bool {
        self.view.endEditing(true);
        return false;
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
        commentTextField.resignFirstResponder()
    }
EN

回答 7

Stack Overflow用户

发布于 2015-05-11 05:00:44

根据苹果的文档,当用户在UITextView之外点击时,默认情况下键盘不会关闭。当您想要通过调用commentTextField.resignFirstResponder()关闭键盘时,您确实需要以编程方式处理此问题。

您的应用程序负责在您选择的时间取消使用键盘。您可能会取消键盘以响应特定的用户操作,例如用户在用户界面中轻敲特定按钮。要关闭键盘,请将resignFirstResponder消息发送到当前为第一响应者的文本视图。

有许多方法可供用户隐藏键盘。

情景1:一种是用户轻触键盘上的Return按钮。这正是您的以下函数的用途:

代码语言:javascript
复制
func textFieldShouldReturn(textField: UITextField!) -> Bool {
    commentTextField.resignFirstResponder();
    return true;
}

但是主要的问题是上面的函数不会被调用,因为你忘了设置UITextFieldDelegate。简而言之,您需要将类定义更改为以下内容:

代码语言:javascript
复制
class CommentsViewController: UIViewController, UITextFieldDelegate /*Add This*/, UITableViewDelegate, UITableViewDataSource {
    // ....
}

您还必须在故事板中或通过代码设置删除。与设置UITableViewDelegateUITableViewDataSource相同。下面是一个在代码中设置它的示例:

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    commentTextField.delegate = self;
}

Situation 2:当用户点击表视图时。您可以简单地实现以下UITableViewDelegate,它应该可以工作。

代码语言:javascript
复制
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    commentTextField.resignFirstResponder();
}

Situation 3:当用户点击背景视图时。这就是下面的代码所要做的。但是,当用户在表视图上点击时,不会调用此函数。如果您想知道原因,请参考responder chain了解更多详细信息。

代码语言:javascript
复制
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    // self.view.endEditing(true); // This line is redundant. 
    commentTextField.resignFirstResponder()
}

总而言之,没有快速而简单的方法来消除键盘上的“当用户在textView之外点击”的说法。你确实需要根据你的需要处理所有不同的情况。

票数 7
EN

Stack Overflow用户

发布于 2015-05-12 18:32:07

尝试在你的tableview上设置键盘重签,如图所示。

以交互方式检查drag -dismiss上的任何-dismiss

票数 4
EN

Stack Overflow用户

发布于 2015-05-07 21:04:39

你添加Table View了吗?

如果是,tableViewCell将接收触摸事件,而不是controller.view

您可以覆盖自定义tableView单元格中的方法:

代码语言:javascript
复制
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        if (xxTextField.isFirstResponder){
            return viewController.view
        }
   return self 
}

另一种你可以尝试的方式,也许是可行的:

UITapGestureRecognizer添加到controller.view

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29836514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档