在不破坏表格视图单元格点击功能的情况下关闭 iOS 键盘

Posted

技术标签:

【中文标题】在不破坏表格视图单元格点击功能的情况下关闭 iOS 键盘【英文标题】:dismissing iOS keyboard on tap without breaking table view cell tap functionality 【发布时间】:2016-05-10 03:37:32 【问题描述】:

我想添加功能以在用户在键盘外点击时关闭 UITextFieldsUITextViews 上的键盘。我有一个与 ios 日历中的新事件非常相似的视图,它是一堆静态表格单元格,其中一些有文本字段,一些发送到显示视图(如日历应用程序中新事件中的“重复”单元格)。

我尝试使用以下内容:

override func viewDidLoad() 
    super.viewDidLoad()

    //Looks for single or multiple taps. 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    view.addGestureRecognizer(tap)


//Calls this function when the tap is recognized.
func dismissKeyboard() 
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)

但这会破坏点击以转到节目的单元格的功能。我可以通过让键盘按下“返回”来解决这个问题,但我不能用我的UITextView 做到这一点,因为它会添加一个换行符。日历应用程序在似乎向上和向下滑动时关闭了UITextView 中的键盘,但我不确定如何自己添加此功能,因为我是 iOS 编程新手。

有解决这个问题的办法吗?

【问题讨论】:

【参考方案1】:

在情节提要中选择您的 tableView。然后在属性检查器中找到键盘并设置为“交互式关闭”。这应该允许向下滑动关闭。

【讨论】:

这不适用于 iOS 10 模拟器。我错过了什么吗? Dismiss on drag 效果很好。【参考方案2】:

日历应用在 UITextView 中似乎上下滑动时关闭键盘

确实如此。这就是你应该做的。文本视图和表格视图都是滚动视图。因此,通常的解决方案是将滚动视图的keyboardDismissMode 设置为.Interactive.OnDrag。日历就是这样做的,你也应该这样做。

【讨论】:

所以我尝试了self.tableView.keyboardDismissMode = .OnDrag(.Interactive 似乎对我没有任何作用),它似乎可以按我的意愿工作,向上或向下拖动会在文本字段/视图中关闭键盘。但是,当我滑动关闭时,我会在日志中打印此内容 -[UIWindow endDisablingInterfaceAutorotationAnimated:] called on <UITextEffectsWindow: 0x144d62150; frame = (0 0; 375 667); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x144d07110>> without matching -beginDisablingInterfaceAutorotation. Ignoring. 这是我需要担心的事情吗? 不,这只是与键盘相关的虚假消息。如果您有时间,请向 Apple 报告,但您可以放心地忽略它。【参考方案3】:

另一种解决方案是,您可以在视图上添加UITapGestureRecognizer,然后在点击视图时关闭键盘,如下所示。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tapGesture];

-(void)handleTap:(UITapGestureRecognizer *)sender 
    //do stuff

【讨论】:

以上是关于在不破坏表格视图单元格点击功能的情况下关闭 iOS 键盘的主要内容,如果未能解决你的问题,请参考以下文章

如何在不离开当前视图的情况下关闭 modalViewController?

如何在不破坏响应性的情况下将 <div> 锚定到表格单元格的左下角?

iOS:在不访问其父 ViewController 的情况下关闭和呈现 ModalViewController

如何在不丢失表格视图单元格的情况下将现有集合视图添加到表格视图

如何在不选择任何行的情况下从 iphone 的表格视图单元格中读取值

在没有触摸手势识别器的情况下关闭键盘