I'm looking for a way to interrupt viewWillDisappear
when the back button is pressed (on UINavigationController), AND a certain data condition occurs, but I cannot find any way to logically keep the user on the view until my conditions have been met.
import UIKit
class DetailViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var serialNumberField: UITextField!
@IBOutlet weak var valueField: UITextField!
@IBOutlet weak var dateLabel: UILabel!
// adds item.name to top of detail view
var item: Item! {
didSet {
navigationItem.title = item.name
}
}
// ************************************
// MARK: Number / Date formatters
// ************************************
let numberFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter
}()
let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
return formatter
}()
// ************************************
// MARK: viewWillAppear
// ************************************
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.dateCreated)
}
// ************************************
// MARK: viewWillDisappear
// ************************************
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// clear first responder...
// this creates smoother transition if the
// keyboard is visible when the back button is pressed.
view.endEditing(true)
// save changes to item
item.name = nameField.text ?? ""
item.serialNumber = serialNumberField.text
if let valueText = valueField.text, let value = numberFormatter.number(from: valueText) {
// item.valueInDollars = value.intValue
// Rounding value of item before passing it back.
item.valueInDollars = Int(round(Float(truncating: value)))
} else {
item.valueInDollars = 0
}
}
// *************************************
// MARK: Resign keyboard with return key
// *************************************
// resign keyboard when return pressed from within textFields
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
// ************************************
// MARK: backGroundTapped TapGesture
// ************************************
@IBAction func backgroundTapped(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
}