Page 250: Control-drag from the top gesture recognizer in the storyboard to the implementation of DetailViewController
Does it matter where I add the implementation? In my case, I added it above the declared IBOutlets at the top which is common practice but when running the app, tapping outside text fields doesn’t seem to hide the keyboard. Any ideas? Thank you in advance!
import UIKit
class DetailVC: UIViewController, UITextFieldDelegate {
@IBAction func backgroundTapped(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
@IBOutlet var nameField: UITextField!
@IBOutlet var serialNumberField: UITextField!
@IBOutlet var valueField: UITextField!
@IBOutlet var dateLabel: UILabel!
var item: Item!
//MARK: NUMBER FORMATTER
let numberFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}()
//MARK: DATE FORMATTER
let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
return formatter
}()
override func viewWillAppear(_ animated: Bool){
super.viewWillAppear(animated)
nameField.text = item.name
serialNumberField.text = item.serialNumber
valueField.text = numberFormatter.string(from: NSNumber(value: item.valueInDollars))
dateLabel.text = dateFormatter.string(from: item.dataCreated)
}
override func viewWillDisappear(_ annimated: Bool) {
super.viewWillDisappear(annimated)
//Clear first responder
view.endEditing(true)
// "Save" changes to the item
item.name = nameField.text ?? ""
item.serialNumber = serialNumberField.text
if let valueText = valueField.text,
let value = numberFormatter.number(from: valueText) {
item.valueInDollars = value.intValue
}else {
item.valueInDollars = 0
}
}
//MARK: DISMISS THE KEYBOARD BY PRESSING THE RETURN KEY
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}