Ich entwickle meine erste iPhone App, und während ich Benutzereinstellungen einfüge, habe ich ein paar Fragen, wie ich das am besten umsetzen kann.Best Practices für die Handhabung von Benutzereinstellungen in einer iPhone MVC App?
Nehmen Sie das grundlegende MVC-Muster an: MainView zeigt Daten an, die in einem Model-Objekt gespeichert sind; MainViewController behandelt die App-Logik.
Für die Optionen habe ich eine OptionsView und eine OptionsViewController. Ein RootViewController übernimmt das Austauschen der Ansichten Main und Options.
Vor allem was ist mit den Optionen Daten? Soll ich eine NSOjbect-abgeleitete Klasse erstellen, um sie zu speichern (ein OptionsModel)? Oder vielleicht würde ein einfaches NSDictionary ausreichen?
Zweitens, wer besitzt die Optionsdaten? Sie sind Anwendungspräferenzen, aber das Speichern in AppDelegate scheint falsch zu sein. MainViewController kümmert sich hauptsächlich um die Optionen, und OptionsViewController muss sie bearbeiten, aber diese Leute kennen einander nicht, noch sollten sie es wahrscheinlich tun. RootViewController kennt beide, also ist er in einer guten Position, um die Optionen zwischen ihnen zu übergeben, aber das scheint wieder falsch zu sein.
Schließlich muss MainViewController häufig auf die Optionen zugreifen. Sollte er jedes Mal das Optionsmodell aufrufen, um eine Option zu bekommen, oder seine eigene Kopie zwischenspeichern? Ich mag die Idee von zusätzlichen Overhead-Abruf-Optionsdaten nicht, aber die Tatsache, dass der MainViewController Kopien hat, die nicht mehr synchron sind, ist auch nicht sehr ansprechend.
briankc, das ist sehr hilfreich, danke. Aber ich wundere mich immer noch über die Kommunikation von Optionen vom OptionsViewController, der sie bearbeiten wird, an den MainViewController, der wissen muss, wann sie sich geändert haben. OptionsViewController könnte sie über NSUserDefaults schreiben, dann eine NSNotification senden, die von MainViewController abgeholt wird, die dann die Optionen von NSUserDefaults lesen würde. Ist das vernünftig? – zpasternack