Reputation: 6679
I have an identical question to this one , but since I'm new to programming and only really know swift I was wondering if someone could give me its equivalent in swift. Or point me to another question that I may have missed that is in swift.
Thanks!
UPDATE: here's the basic jist of my view controller after I've cut some of the fat away to deal with only the relevant topic. To restate the problem. Not until I have clicked my 'doneButton' to run the createClient() function and navigate back to the client page to edit the freshly created client will the the tap gesture work to dismiss the keyboard.
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)
}
}
Upvotes: 18
Views: 20648
Reputation: 286
Accepted answer doesn't work for me on XCode 13.1, so I changed the code a little bit:
override func viewDidLoad() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.hideKeyboard))
tapGesture.cancelsTouchesInView = true
tableView.addGestureRecognizer(tapGesture)
}
@objc func hideKeyboard() {
tableView.endEditing(true)
}
Upvotes: 1
Reputation: 14296
Swift 4:
On ViewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
self.yourTableView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:))))
}
On corresponding function:
@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
}
Upvotes: 4
Reputation: 855
As @Ben already recommended, you can also do this programmatically. Just put this in your viewDidLoad()
tableView.keyboardDismissMode = .onDrag
Upvotes: 7
Reputation: 359
override func viewDidLoad() { super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
tapGesture.cancelsTouchesInView = true
self.view.addGestureRecognizer(tapGesture)
}
func hideKeyboard()
{
self.view.endEditing(true)
}
this will work fine compared to the above which didnt work for me
Upvotes: 3
Reputation: 193
For some reason, @Isuru's answer crashes in my app (XCode 7.2.1), and thankfully it's just a minor change - just remove the Selector()
call:
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: "hideKeyboard")
tapGesture.cancelsTouchesInView = true
tableView.addGestureRecognizer(tapGesture)
}
func hideKeyboard() {
tableView.endEditing(true)
}
Upvotes: 3
Reputation: 31283
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
tapGesture.cancelsTouchesInView = true
tableView.addGestureRecognizer(tapGesture)
}
func hideKeyboard() {
tableView.endEditing(true)
}
Translating Objective-C code to Swift is not really hard. You just require a basic knowledge in both languages. If you're new to programming I guess you should familiarise with yourself with the basics first.
Upvotes: 33