inputAccessoryView关闭键盘

时间:2015-04-24 00:07:28

标签: objective-c swift

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

当前尝试:

MID(
   [Description]
   , FIND([Description], "Target Name:") + 13
   , FIND([Description], " ", FIND([Description], "Target Name:") + 15)
     - (FIND([Description], "Target Name:") + 13)
)

7 个答案:

答案 0 :(得分:7)

根据Apple的文档,当用户点击UITextView之外时,键盘默认不会被忽略。如果要通过调用commentTextField.resignFirstResponder()来关闭键盘,则需要以编程方式处理此问题。

UITextFiled Reference about Managing the Keyboard

  

您的应用程序有责任在您选择时关闭键盘。您可以关闭键盘以响应特定的用户操作,例如用户点击用户界面中的特定按钮。要关闭键盘,请将resignFirstResponder消息发送到当前第一个响应者的文本视图。

用户可以通过多种方式隐藏键盘。

情境1 :一个是当用户点击键盘上的 Return 按钮时。这正是您的以下功能:

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    commentTextField.resignFirstResponder();
    return true;
}

但主要问题是上述功能因为忘记设置UITextFieldDelegate而无法调用。简而言之,您需要将类定义更改为以下内容:

class CommentsViewController: UIViewController, UITextFieldDelegate /*Add This*/, UITableViewDelegate, UITableViewDataSource {
    // ....
}

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

override func viewDidLoad() {
    super.viewDidLoad()
    commentTextField.delegate = self;
}

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

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    commentTextField.resignFirstResponder();
}

情境3 :当用户点按背景视图时。这是以下代码的用途。但是,当用户点击表格视图时,不会调用此函数。如果您想知道原因,请参阅responder chain了解更多详情。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    // self.view.endEditing(true); // This line is redundant. 
    commentTextField.resignFirstResponder()
}

总而言之,当用户点击textView"时,没有快捷简便的方法来解除键盘说"。您需要根据需要处理所有不同的情况。

enter image description here

答案 1 :(得分:3)

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

检查任何 - 阻力消失 - 以交互方式拒绝

Set keyboard release on tableview interations

答案 2 :(得分:1)

你添加了Table View吗?

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

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

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        if (xxTextField.isFirstResponder){
            return viewController.view
        }
   return self 
}

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

UITapGestureRecognizer添加到controller.view

答案 3 :(得分:1)

当你在我的UITextField"之外说'#34;我猜你的意思是"在我视图中的另一个元素"。我可以看到您有UITableViewDelegateUITableViewDataSource,它告诉我tableView内有CommentsViewController

您可以实现func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)功能,您可以通过调用commentTextField.resignFirstResponder()

来重新设置键盘

答案 4 :(得分:1)

首先,您的视图控制器需要实现UITextFieldDelegate,所以添加它。然后,将视图控制器设置为文本字段的委托

enter image description here

然后添加这些方法。当文本字段结束编辑时,第一个将resignFirstResponder。当你回击时,第二个辞职。点击背景时,最后一个强制文本字段结束编辑。

func textFieldDidEndEditing(textField: UITextField) {
    textField.resignFirstResponder()
} 

func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    self.commentTextField.endEditing(true)
}

答案 5 :(得分:1)

修改

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

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        self.view.endEditing(true)
    }

它应该完成这项工作。

答案 6 :(得分:-1)

试试这个

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    self.view.endEditing(true);
    commentTextField.resignFirstResponder()
}