快速-点击手势以关闭键盘UITableView

快速-点击手势以关闭键盘UITableView,uitableview,swift,uitapgesturerecognizer,Uitableview,Swift,Uitapgesturerecognizer,我有一个与之相同的问题,但由于我是编程新手,而且只真正了解swift,我想知道是否有人能给我提供swift中的等价物。或者给我指出另一个我可能在swift中遗漏的问题 谢谢 更新:这里是我的视图控制器的基本jist,在我去掉一些脂肪后,只处理相关主题。重申这个问题。直到我单击我的“doneButton”以运行createClient()函数并导航回客户端页面以编辑新创建的客户端,点击手势才会关闭键盘 import UIKit import CoreData import Foundation

我有一个与之相同的问题,但由于我是编程新手,而且只真正了解swift,我想知道是否有人能给我提供swift中的等价物。或者给我指出另一个我可能在swift中遗漏的问题

谢谢

更新:这里是我的视图控制器的基本jist,在我去掉一些脂肪后,只处理相关主题。重申这个问题。直到我单击我的“doneButton”以运行createClient()函数并导航回客户端页面以编辑新创建的客户端,点击手势才会关闭键盘

import UIKit
import CoreData
import Foundation

class NewClientTableViewController: UITableViewController, UINavigationControllerDelegate, UITextFieldDelegate {

let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext

@IBOutlet weak var nameTxt: UITextField!
@IBOutlet weak var ageTxt: UITextField!
@IBOutlet weak var phoneTxt: UITextField!
@IBOutlet weak var emailTxt: UITextField!
@IBOutlet weak var heightTxt: UITextField!
@IBOutlet weak var notesTxt: UITextView!

var client: Client? = nil

override func viewDidLoad() {
    super.viewDidLoad()

    if client != nil {

        nameTxt.text = client?.name
        ageTxt.text = client?.age
        heightTxt.text = client?.height
        phoneTxt.text = client?.phone
        emailTxt.text = client?.email
        notesTxt.text = client?.notes

        self.title = client?.name
        phoneTxt.delegate = self

        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
        tapGesture.cancelsTouchesInView = true

        tableView.addGestureRecognizer(tapGesture)

    }
}

func hideKeyboard() {
    tableView.endEditing(true)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func doneButton(sender: AnyObject) {
    if client != nil {
        editClient()
    } else {
        createClient()
    }
    dismissViewController()

}

func editClient() {

    client?.name = nameTxt.text
    client?.age = ageTxt.text
    client?.height = heightTxt.text
    client?.phone = phoneTxt.text
    client?.email = emailTxt.text
    client?.notes = notesTxt.text
    client?.clientImage = UIImageJPEGRepresentation(contactImage.image, 1)

    managedObjectContext?.save(nil)
}

func createClient() {

    let entityDescription = NSEntityDescription.entityForName("Client", inManagedObjectContext: managedObjectContext!)
    let client = Client(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)

    if nameTxt.text == "" {
        client.name = "Untitled Client"
    } else {
        client.name = nameTxt.text
    }

    client.age = ageTxt.text
    client.height = heightTxt.text
    client.phone = phoneTxt.text
    client.email = emailTxt.text
    client.notes = notesTxt.text

    client.clientImage = UIImageJPEGRepresentation(contactImage.image, 1)

    managedObjectContext?.save(nil)

}

func dismissViewController() {
    navigationController?.popToRootViewControllerAnimated(true)
    }
}

将Objective-C代码翻译成Swift并不困难。你只需要掌握两种语言的基本知识。如果你是编程新手,我想你应该先熟悉基本知识。

你也可以从故事板上完成:


由于某种原因,@Isuru的答案在我的应用程序(XCode 7.2.1)中崩溃了,谢天谢地,这只是一个小改动-只需删除
选择器()
调用:

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideKeyboard")
    tapGesture.cancelsTouchesInView = true
    tableView.addGestureRecognizer(tapGesture)
}

func hideKeyboard() {
    tableView.endEditing(true)
}
重写func viewDidLoad(){ super.viewDidLoad()


与上面提到的@Ben已经推荐的对我不起作用的方法相比,这个方法可以很好地工作,你也可以通过编程来实现。 只需将其放入viewDidLoad()中

Swift 4:

在ViewDidLoad上:

    override func viewDidLoad() {
        super.viewDidLoad()
self.yourTableView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:))))

    }
关于相应的功能:

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    if sender.state == .ended {
        // Do your thang here!
        self.view.endEditing(true)
        for textField in self.view.subviews where textField is UITextField {
            textField.resignFirstResponder()
        }
    }
    sender.cancelsTouchesInView = false
}

我需要用这种方式连接我的手势识别器吗?好的,让它工作。但为什么在我实际保存联系人之前它不工作(我的应用程序中有一个联系人表单)。我必须编辑联系人才能使其正常工作。这么少的信息很难说。请详细说明。也许可以用更多信息和您迄今为止的代码更新您的原始问题。哦,伙计。我刚刚解决了它。直到我发布编辑后,我才意识到TapPaste出现在我的if client!=nil语句中。带来了它在视图外加载,现在效果很好。我一定很累了…:)再次感谢。我想:点击手势。取消触摸视图=错误非常感谢。其他解决方案,至少是我用手势识别器尝试过的一种,阻止我选择一个表单元格进入另一个视图。该手势将取消触摸。Menti上面提到过,但有一个修复方法@JozemiteApps-tappershive.cancelsTouchesInView=trueThankyou。网络上有这么多答案,过于复杂,但你是唯一一个说出明显方式的人。这我不知道是否存在。谢谢。你的答案与公认的答案有什么不同?尽管它缺乏一些好的格式和详细的解释夷平面?
tableView.keyboardDismissMode = .onDrag
    override func viewDidLoad() {
        super.viewDidLoad()
self.yourTableView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:))))

    }
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    if sender.state == .ended {
        // Do your thang here!
        self.view.endEditing(true)
        for textField in self.view.subviews where textField is UITextField {
            textField.resignFirstResponder()
        }
    }
    sender.cancelsTouchesInView = false
}