通过触摸UITableView的背景来关闭键盘

Hua*_*ing 102 uitableview uikeyboard ios

我有一个UITableViewUITextFieldS作为细胞.当UITableView触摸背景时,我想解除键盘.我试图通过创建一个UIButton大小UITableView并将其放在后面来做到这一点UITableView.唯一的问题是,UIButton即使触摸在UITableView上,也能捕获所有触摸.我究竟做错了什么?

谢谢!

mix*_*xja 198

这可以通过创建UITapGestureRecognizer对象轻松完成(默认情况下,这将在单击时检测"手势",因此无需进一步自定义),指定触发手势时的目标/动作,然后附加手势识别器对象到你的表视图.

也许在你的viewDidLoad方法中:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];
Run Code Online (Sandbox Code Playgroud)

hideKeyboard方法可能是这样的:

- (void) hideKeyboard {
    [textField1 resignFirstResponder];
    [textField2 resignFirstResponder];
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,触摸UITextField对象内部时不会触发手势.它虽然在UITableView背景,页脚视图,标题视图和UILabels内部单元格等上被触发.

  • 下面的解决方案指出,你可以通过设置:`gestureRecognizer.cancelsTouchesInView = NO;来更好地完成这项工作. (106认同)
  • 对于`hideKeyboard`方法,不是直接与文本字段通信,而是可以做`[self.view endEditing:NO];`.来自Apple文档:"*此方法查看当前视图及其子视图层次结构,以查找当前第一个响应者的文本字段.如果找到一个,则要求该文本字段作为第一响应者辞职.如果设置了force参数至YES,文本字段甚至不被询问;它被迫辞职.*" (39认同)
  • 当我尝试这个时,我发现它阻止了表格选择单元格:(.非常棒的解决方案 (4认同)
  • 并且不要忘记在将gestureRecognizer附加到tableView后释放它. (3认同)

小智 126

如果设置:UITapGestureRecognizer解决方案适用于表格单元格选择:

gestureRecognizer.cancelsTouchesInView = NO;
Run Code Online (Sandbox Code Playgroud)


Saa*_*aad 61

这是最好的方法.就这样做吧

[self.view endEditing:YES];
Run Code Online (Sandbox Code Playgroud)

要么

[[self.tableView superView] endEditing:YES];
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 53

您也可以从Storyboard中执行此操作: 在此输入图像描述

  • 无论我选择什么:拖动时关闭,交互式关闭,当我触摸表格单元格时,它会被选中。我正在使用 Xcode 8,swift 3。请帮助 (2认同)

Raj*_*ain 22

作为UITableView子类UIScrollView,下面实现一个委托方法提供了一个非常简单,快速的解决方案.甚至不需要参与,resignFirstResponder因为视图层次结构内省并找到当前响应者并要求它重新签署响应者状态.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}
Run Code Online (Sandbox Code Playgroud)

并记得添加UIScrollViewDelegate到头文件.

  • 如果您的目标是iOS7及以上版本,可以通过@Joe Masilotti指出的这一个内衬来完成:`self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;` (2认同)

bbe*_*ord 13

首先,听scrollViewWillBeginDraggingUIViewController的加入UIScrollViewDelegate:

在.h文件中:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 
Run Code Online (Sandbox Code Playgroud)

在.m文件中:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {

    [self dismissKeyboard];

}
Run Code Online (Sandbox Code Playgroud)

然后听其他互动:

- (void)setupKeyboardDismissTaps {

    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UISwipeGestureRecognizer *swipeDownGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeDownGestureRecognizer.cancelsTouchesInView = NO;
    swipeDownGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.tableView addGestureRecognizer:swipeDownGestureRecognizer];

    UISwipeGestureRecognizer *swipeLeftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeLeftGestureRecognizer.cancelsTouchesInView = NO;
    swipeLeftGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:swipeLeftGestureRecognizer];

    UISwipeGestureRecognizer *swipeRightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeRightGestureRecognizer.cancelsTouchesInView = NO;
    swipeRightGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:swipeRightGestureRecognizer];


    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}
Run Code Online (Sandbox Code Playgroud)

然后执行dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}
Run Code Online (Sandbox Code Playgroud)

如果像我一样,你想在自定义表格单元格中关闭UITextField的键盘:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [customCell.textFieldInCell resignFirstResponder]; 

}
Run Code Online (Sandbox Code Playgroud)

希望能帮助任何人搜索!!


Dom*_*yan 9

tableView.keyboardDismissMode = .onDrag
Run Code Online (Sandbox Code Playgroud)


sha*_*sha 7

我是这样做的:

在TableViewController中创建一个方法来停用第一个响应者(在那个时候是你的TextBox)

- (BOOL)findAndResignFirstResonder:(UIView *)stView {
    if (stView.isFirstResponder) {
        [stView resignFirstResponder];
        return YES;     
    }

    for (UIView *subView in stView.subviews) {
        if ([self findAndResignFirstResonder:subView]) {
            return YES;
        }
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

tableView:didSelectRowAtIndexPath:调用前一个方法:

- (void)tableView:(UITableView *)tableView
                             didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [self findAndResignFirstResonder: self.view];
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在表格视图单元格内(并且在该表格视图单元格内的任何UITextField之外)点击,这可以很好地工作.但是,如果我点击表格视图的背景(这通常是一个更容易达到的目标 - yay Fitts定律!),没有这样的运气.是的,这是预期的,因为我们在tableView:didSelectRowAtIndexPath:中执行此操作.如果这可以通过某种方式进行调整,以便在表视图中的任何其他地方点击(否则不会想要键盘焦点),我想我们在这里有一个胜利者! (2认同)

小智 7

这是您的编码乐趣的快速版本:

它添加了一个轻敲手势识别器然后解除键盘.不需要TextField的插座!

override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}

func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        view.endEditing(true)
    }
    sender.cancelsTouchesInView = false
}
Run Code Online (Sandbox Code Playgroud)


Iva*_*nin 7

有Swift 3版本,没有阻止单元格上的点击。

viewDidLoad()方法中:

let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)
Run Code Online (Sandbox Code Playgroud)

而且hideKeyboard是这样的:

func hideKeyboard() {
    view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我有一个UITableViewController实施touchesBegan:withEvent:并没有为我工作.

这是有效的:

迅速:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    view.endEditing(true)
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.view endEditing:YES];
}
Run Code Online (Sandbox Code Playgroud)