Questa domanda viene fuori tutto il tempo.
Un suggerimento è creare un contenitore di dati singleton: un oggetto che viene creato una sola volta nella vita della tua applicazione e persiste per la vita della tua app.
Questo approccio è adatto per una situazione in cui si dispone di dati di app globali che devono essere disponibili / modificabili in diverse classi nella propria app.
Altri approcci come l'impostazione di collegamenti unidirezionali o bidirezionali tra i controller di visualizzazione sono più adatti alle situazioni in cui si passano informazioni / messaggi direttamente tra i controller di visualizzazione.
(Vedi la risposta di nhgrif, di seguito, per altre alternative.)
Con un contenitore di dati singleton, aggiungi una proprietà alla tua classe che memorizza un riferimento al tuo singleton e quindi usa quella proprietà ogni volta che hai bisogno di accedere.
Puoi configurare il tuo singleton in modo che salvi i suoi contenuti su disco in modo che lo stato della tua app persista tra i lanci.
Ho creato un progetto demo su GitHub dimostrando come puoi farlo. Ecco il link:
Progetto SwiftDataContainerSingleton su GitHub
Ecco il README di quel progetto:
SwiftDataContainerSingleton
Una dimostrazione dell'utilizzo di un contenitore di dati singleton per salvare lo stato dell'applicazione e condividerlo tra gli oggetti.
Il DataContainerSingleton
classe è il singleton effettivo.
Utilizza una costante statica sharedDataContainer
per salvare un riferimento al singleton.
Per accedere al singleton, usa la sintassi
DataContainerSingleton.sharedDataContainer
Il progetto di esempio definisce 3 proprietà nel contenitore di dati:
var someString: String?
var someOtherString: String?
var someInt: Int?
Per caricare la someInt
proprietà dal contenitore di dati, dovresti utilizzare un codice come questo:
let theInt = DataContainerSingleton.sharedDataContainer.someInt
Per salvare un valore in someInt, dovresti usare la sintassi:
DataContainerSingleton.sharedDataContainer.someInt = 3
Il init
metodo di DataContainerSingleton aggiunge un osservatore per UIApplicationDidEnterBackgroundNotification
. Quel codice ha questo aspetto:
goToBackgroundObserver = NSNotificationCenter.defaultCenter().addObserverForName(
UIApplicationDidEnterBackgroundNotification,
object: nil,
queue: nil)
{
(note: NSNotification!) -> Void in
let defaults = NSUserDefaults.standardUserDefaults()
//-----------------------------------------------------------------------------
//This code saves the singleton's properties to NSUserDefaults.
//edit this code to save your custom properties
defaults.setObject( self.someString, forKey: DefaultsKeys.someString)
defaults.setObject( self.someOtherString, forKey: DefaultsKeys.someOtherString)
defaults.setObject( self.someInt, forKey: DefaultsKeys.someInt)
//-----------------------------------------------------------------------------
//Tell NSUserDefaults to save to disk now.
defaults.synchronize()
}
Nel codice dell'osservatore salva le proprietà del contenitore di dati in NSUserDefaults
. Puoi anche usareNSCoding
Core Data o vari altri metodi per salvare i dati di stato.
Il init
metodo di DataContainerSingleton tenta anche di caricare i valori salvati per le sue proprietà.
Quella parte del metodo init ha questo aspetto:
let defaults = NSUserDefaults.standardUserDefaults()
//-----------------------------------------------------------------------------
//This code reads the singleton's properties from NSUserDefaults.
//edit this code to load your custom properties
someString = defaults.objectForKey(DefaultsKeys.someString) as! String?
someOtherString = defaults.objectForKey(DefaultsKeys.someOtherString) as! String?
someInt = defaults.objectForKey(DefaultsKeys.someInt) as! Int?
//-----------------------------------------------------------------------------
Le chiavi per il caricamento e il salvataggio dei valori in NSUserDefaults sono archiviate come costanti stringa che fanno parte di una struttura DefaultsKeys
, definita in questo modo:
struct DefaultsKeys
{
static let someString = "someString"
static let someOtherString = "someOtherString"
static let someInt = "someInt"
}
Fai riferimento a una di queste costanti in questo modo:
DefaultsKeys.someInt
Utilizzando il contenitore di dati singleton:
Questa applicazione di esempio utilizza trival il singleton del contenitore di dati.
Sono disponibili due controller di visualizzazione. La prima è una sottoclasse personalizzata di UIViewController ViewController
e la seconda è una sottoclasse personalizzata di UIViewController SecondVC
.
Entrambi i controller di visualizzazione hanno un campo di testo su di essi ed entrambi caricano un valore dalla proprietà del contenitore di dati singlelton someInt
nel campo di testo nel loroviewWillAppear
metodo, ed entrambi salvano il valore corrente dal campo di testo nel "someInt" del contenitore di dati.
Il codice per caricare il valore nel campo di testo è nel viewWillAppear:
metodo:
override func viewWillAppear(animated: Bool)
{
//Load the value "someInt" from our shared ata container singleton
let value = DataContainerSingleton.sharedDataContainer.someInt ?? 0
//Install the value into the text field.
textField.text = "\(value)"
}
Il codice per salvare il valore modificato dall'utente nel contenitore dati si trova nei textFieldShouldEndEditing
metodi dei controller di visualizzazione :
func textFieldShouldEndEditing(textField: UITextField) -> Bool
{
//Save the changed value back to our data container singleton
DataContainerSingleton.sharedDataContainer.someInt = textField.text!.toInt()
return true
}
È necessario caricare i valori nell'interfaccia utente in viewWillAppear anziché in viewDidLoad in modo che l'interfaccia utente si aggiorni ogni volta che viene visualizzato il controller di visualizzazione.