swiftdelegatesnsnotification

Access class variable from any ViewController


I have this structure for my app:

The class ChosenPatient comes from the ModelController:

class ChosenPatient: NSObject {
    var data = Patient()
    { ... multiple functions ... }    
}

All I need in my updateLabels() of my SearchViewController is to access to:

label.stringValue = chosenPatient.data.name/lastName/age etc

But I want to do the same in my DetailsViewController. Simply I want to have a function updateLabels() that retrieve the SAME patient I have chosen in the SearchViewController and access all information that patient have.

I have read about NSNotifications, Delegates and Segues but I couldn't find a good explanatory method that could be adapted to my app scheme.

I want to have a GLOBAL variable with an unique Patient(), and access to the patient.data from any ViewController in a simple and concise way.

Regards :)

[Using XCODE 8.3, swift 3.2, app for macOS]


Solution

  • I would typically use a protocol-delegate pattern if it's a one-to-one relationship. You wouldn't want to keep any variable global unless absolutely necessary.

    Make a custom class for your UITabBarController and assign SearchViewController to the DetailViewController dataSource.

    protocol ChosenPatientDataSource: class {
        var chosenPatient: ChoosenPatient { get }
    }
    
    class SearchViewController: UITableViewController, ChosenPatientDataSource {
        var chosenPatient = ChosenPatient()
    }
    
    class DetailViewController: UIViewController {
        weak var dataSource: ChosenPatientDataSource?
    
        func useChosenPatient() {
            let chosenPatient = dataSource?.chosenPatient
            ...
        }
    }
    

    Hope it's to some help!