0

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)
    }    
}
TylerP
  • 9,600
  • 4
  • 39
  • 43
Iggy
  • 33
  • 6
  • 5
    `viewWillDisappear` just tells you that something is already happening. It doesn't give you a way to interrupt it. Instead, use a custom back button and check the condition before even popping the screen. – Sulthan Sep 26 '21 at 18:24
  • 1
    Check with [How to enable back swipe gesture in UINavigationCintrollee after setting left button](https://stackoverflow.com/questions/34942571/how-to-enable-back-left-swipe-gesture-in-uinavigationcontroller-after-setting-le). This is not a direct answer but you will find enough information for your needs – Ptit Xav Sep 26 '21 at 18:31

0 Answers0