Diese Frage taucht ständig auf.
Ein Vorschlag besteht darin, einen Datencontainer-Singleton zu erstellen: Ein Objekt, das einmal und nur einmal im Leben Ihrer Anwendung erstellt wird und für das Leben Ihrer App bestehen bleibt.
Dieser Ansatz eignet sich gut für Situationen, in denen Sie über globale App-Daten verfügen, die für verschiedene Klassen in Ihrer App verfügbar / änderbar sein müssen.
Andere Ansätze wie das Einrichten von Einweg- oder Zweiwegverbindungen zwischen Ansichtssteuerungen eignen sich besser für Situationen, in denen Sie Informationen / Nachrichten direkt zwischen Ansichtssteuerungen weitergeben.
(Weitere Alternativen finden Sie in der Antwort von nhgrif weiter unten.)
Mit einem Datencontainer-Singleton fügen Sie Ihrer Klasse eine Eigenschaft hinzu, in der ein Verweis auf Ihren Singleton gespeichert ist, und verwenden diese Eigenschaft dann, wenn Sie Zugriff benötigen.
Sie können Ihren Singleton so einrichten, dass er seinen Inhalt auf der Festplatte speichert, sodass Ihr App-Status zwischen den Starts bestehen bleibt.
Ich habe auf GitHub ein Demo-Projekt erstellt, das zeigt, wie Sie dies tun können. Hier ist der Link:
SwiftDataContainerSingleton-Projekt auf GitHub
Hier ist die README von diesem Projekt:
SwiftDataContainerSingleton
Eine Demonstration der Verwendung eines Datencontainer-Singletons zum Speichern des Anwendungsstatus und zum Freigeben zwischen Objekten.
Die DataContainerSingleton
Klasse ist der eigentliche Singleton.
Es verwendet eine statische Konstante sharedDataContainer
, um einen Verweis auf den Singleton zu speichern.
Verwenden Sie die Syntax, um auf den Singleton zuzugreifen
DataContainerSingleton.sharedDataContainer
Das Beispielprojekt definiert 3 Eigenschaften im Datencontainer:
var someString: String?
var someOtherString: String?
var someInt: Int?
Um die someInt
Eigenschaft aus dem Datencontainer zu laden , verwenden Sie folgenden Code:
let theInt = DataContainerSingleton.sharedDataContainer.someInt
Um einen Wert in someInt zu speichern, verwenden Sie die folgende Syntax:
DataContainerSingleton.sharedDataContainer.someInt = 3
Die DataContainerSingleton- init
Methode fügt einen Beobachter für die hinzu UIApplicationDidEnterBackgroundNotification
. Dieser Code sieht folgendermaßen aus:
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()
}
Im Beobachtercode werden die Eigenschaften des Datencontainers in gespeichert NSUserDefaults
. Sie können auch NSCoding
Core Data oder verschiedene andere Methoden zum Speichern von Statusdaten verwenden.
Die DataContainerSingleton- init
Methode versucht auch, gespeicherte Werte für ihre Eigenschaften zu laden.
Dieser Teil der init-Methode sieht folgendermaßen aus:
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?
//-----------------------------------------------------------------------------
Die Schlüssel zum Laden und Speichern von Werten in NSUserDefaults werden als Zeichenfolgenkonstanten gespeichert, die Teil einer Struktur sind DefaultsKeys
, die wie folgt definiert ist:
struct DefaultsKeys
{
static let someString = "someString"
static let someOtherString = "someOtherString"
static let someInt = "someInt"
}
Sie verweisen auf eine dieser Konstanten wie folgt:
DefaultsKeys.someInt
Verwenden des Datencontainers Singleton:
Diese Beispielanwendung verwendet den Datencontainer-Singleton in drei Fällen.
Es gibt zwei Ansichtssteuerungen. Die erste ist eine benutzerdefinierte Unterklasse von UIViewController ViewController
und die zweite ist eine benutzerdefinierte Unterklasse von UIViewController SecondVC
.
Auf beiden Ansichts-Controllern befindet sich ein Textfeld, und beide laden someInt
in ihrer viewWillAppear
Methode einen Wert aus der Eigenschaft des Datencontainers singlelton in das Textfeld , und beide speichern den aktuellen Wert aus dem Textfeld zurück im `someInt 'des Datencontainers.
Der Code zum Laden des Werts in das Textfeld befindet sich in der viewWillAppear:
Methode:
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)"
}
Der Code zum Speichern des vom Benutzer bearbeiteten Werts im Datencontainer befindet sich in den textFieldShouldEndEditing
Methoden der View Controller :
func textFieldShouldEndEditing(textField: UITextField) -> Bool
{
//Save the changed value back to our data container singleton
DataContainerSingleton.sharedDataContainer.someInt = textField.text!.toInt()
return true
}
Sie sollten Werte in viewWillAppear und nicht in viewDidLoad in Ihre Benutzeroberfläche laden, damit Ihre Benutzeroberfläche jedes Mal aktualisiert wird, wenn der View Controller angezeigt wird.