我已经编写了自己的函数,当键盘出现时滚动文本字段。为了通过点击离开文本字段来取消键盘,我创建了一个UITapGestureRecognizer,它负责在点击离开时放弃文本字段上的第一个响应器。

现在我还为文本字段创建了一个自动完成,它在文本字段的下面创建了一个UITableView,并在用户输入文本时用项目填充它。

但是,当选择自动补全表中的一个条目时,不会调用didSelectRowAtIndexPath。相反,它似乎是点击手势识别器被调用,只是辞职第一响应器。

我猜有一些方法告诉点击手势识别器继续将点击消息传递给UITableView,但我不知道它是什么。任何帮助都将不胜感激。


当前回答

我的情况是不同的,包括一个uisearchbar和uitableview在self.view。我想通过触摸视图来消除uisearchbar键盘。

var tapGestureRecognizer:UITapGestureRecognizer?

override func viewWillAppear(animated: Bool) {
    tapGestureRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleTap:"))
}

关于UISearchBar委托方法:

func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
    view.addGestureRecognizer(tapGestureRecognizer!)
    return true
}
func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool {
    view.removeGestureRecognizer(tapGestureRecognizer!)
    return true
}

当用户触摸self.view时:

func handleTap(recognizer: UITapGestureRecognizer) {
    sampleSearchBar.endEditing(true)
    sampleSearchBar.resignFirstResponder()
}

其他回答

对于Swift 5中的CollectionView:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if gestureRecognizer is UITapGestureRecognizer {
        let location = touch.location(in: mCollectionView)
        return (mCollectionView.indexPathForItem(at: location) == nil)
    }
    return true
}

对于(表/集合)视图下的任何手势,只需将取消视图中的触摸设置为false:

——Interfacebuilder

——代码

<#gestureRecognizer#>.cancelsTouchesInView = false

问题: 在我的例子中,问题是我最初在每个collectionView单元格中放置了一个按钮,并设置了填充单元格的约束,这样当单击单元格时,它就会单击按钮,然而按钮函数是空的,因此似乎什么都没有发生。

解决办法: 我通过从集合视图单元格中删除按钮来解决这个问题。

在swift中,您可以在内部使用此功能

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if CheckTheTime() == true {
        // do something 
    }else{
    }
}

func CheckTheTime() -> Bool{
    return true
}

虽然现在已经很晚了,很多人发现上面的建议还不错,但我无法让Jason或TMilligan的方法起作用。

我有一个静态tableView与多个单元格包含文本字段接收数字输入只使用数字键盘。这对我来说很理想:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if(![touch.view isKindOfClass:[UITableViewCell class]]){

        [self.firstTF resignFirstResponder];
        [self.secondTF resignFirstResponder];
        [self.thirdTF resignFirstResponder];
        [self.fourthTF resignFirstResponder];

        NSLog(@"Touches Work ");

        return NO;
    }
    return YES;
}

确保你已经在你的.h文件中实现了<UIGestureRecognizerDelegate>。

这条线!view isKindOfClass:[UITableViewCell类]]检查tableViewCell是否被点击,并解散任何活动键盘。