RedDevil
RedDevil

Reputation: 13

Sending value back from detail to master

I am using a master-detail model in Swift. However, I want to send a class object created in detail view back to master view. I wrote a unwind function in the master view, but I cannot see the back button in the detail view so I cannot ctrl+drag it to the exit.

Does anyone know how to set the back button to make it visible?

Upvotes: 0

Views: 357

Answers (1)

Rob
Rob

Reputation: 438162

Rather than worrying about hooking up something to the back button, you can update the model directly as the user updates the fields in the detail view controller. To do this you can pass a reference to some model object that contains the properties to be updated (make sure that's a reference type, e.g., a class, and not a struct, though).

For example:

class Person {
    var firstName: String?
    var lastName: String?
}

class MasterViewController: UIViewController {

    @IBOutlet weak var firstNameLabel: UILabel!
    @IBOutlet weak var lastNameLabel: UILabel!

    var person = Person()

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let destination = segue.destinationViewController as? DetailViewController {
            destination.person = person
        }
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        firstNameLabel.text = person.firstName
        lastNameLabel.text = person.lastName
    }
}

class DetailViewController: UIViewController,UITextFieldDelegate {

    var person: Person?

    @IBOutlet weak var firstNameTextField: UITextField!
    @IBOutlet weak var lastNameTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        firstNameTextField.text = person?.firstName
        lastNameTextField.text = person?.lastName
    }

    // Note, I specified the detail view controller to be the delegate
    // for the two text fields in IB: I then can detect when editing is
    // done and act accordingly.

    func textFieldDidEndEditing(textField: UITextField) {
        switch textField {
        case firstNameTextField:
            person?.firstName = textField.text
        case lastNameTextField:
            person?.lastName = textField.text
        default:
            assert(false, "unidentified textField \(textField)")
        }
    }
}

You can have master view controller update itself in viewDidAppear, like I did above, or, better, you could add observers for the model properties. But hopefully it illustrates the basic idea.

Upvotes: 1

Related Questions