Ich habe diese Seite seit einiger Zeit passiv benutzt und habe die FAQ gelesen, also hoffe ich, dass ich sie auf ein Minimum reduzieren kann.
Ich habe eine Frage zu Settings.bundle-Dateien in Objective-C. Ich habe die folgenden Anleitungen verwendet, um eines davon zu implementieren:
Ich benutze sowohl Xcode 4.1 als auch den neuesten Xcode 3. Ich habe Version 3 verwendet, um das Settings.bundle und seine Pliste zu erstellen, da ich den Plisteditor von Xcode 4 als etwas buggy empfand.
Dies sind die Inhalte meiner Root.plist:
%Vor%Ich kann problemlos auf die Einstellungen im iOS-Einstellungsmenü zugreifen und auch den Wert des einzelnen Eintrags ändern, den ich bisher hatte. Der Wert wird zwischen Sitzungen auf dem iOS-Simulator sowie auf meinem physischen iOS-Gerät (einem iPhone 4) gespeichert.
Ich kann jedoch aus meinem Code nicht auf diesen Wert zugreifen. Lassen Sie mich Ihnen zeigen, wie ich es versucht habe (in der ViewController.m meiner App):
%Vor%Seltsamerweise, wenn ich versuche, die App in Xcode 3 auszuführen, erhalte ich keine Fehlermeldungen (wie eine SIGABRT o.ä.) oder Debugger-Ausgaben. Der Bildschirm des iPhone Simulators wird für einen Moment schwarz, da er versucht, die App zu starten, und dann werde ich zurück auf den Startbildschirm gebracht.
Xcode 4 zeigt etwas seltsames Verhalten. Es schafft es, die Benutzeroberfläche meiner Anwendung für ein oder zwei Sekunden zu zeigen und bringt mich dann zurück zum Startbildschirm des iPhone Simulators. Es zeigt auch eine SIGABRT etwas weiter unten in meinem Code, wo ich versuche, einen Wert von einer JSON-Antwort zu erhalten:
%Vor%Da die JSON-Zeichenfolge von einem PHP-Skript mit GET-Parametern generiert wird, die von meiner App übergeben werden - eine davon die Benutzer-ID aus dem Settings.bundle - ist es nicht verwunderlich, dass dies nicht funktionieren sollte. Es sollte jedoch nicht abstürzen, da ich diesen Fehler früher in meinem Code erhalte, aber das ist wahrscheinlich nicht mit meinem Einstellungsproblem verbunden. Ein echter Schmerz im Nacken ist jedoch die Tatsache, dass Xcode (irgendwie) zusammen mit meiner App im iPhone Simulator abstürzt. Erstens funktioniert Xcode normal weiter, außer dass ich das Programm, das immer noch läuft, nicht abbrechen kann. Ich kann auf den Stop-Button in Xcode klicken, aber ohne Wirkung. Wenn ich versuche, Xcode zu verlassen, fragt es mich, ob es das laufende Programm beenden sollte und wenn ich ja anklicke, stürzt es wirklich ab und ich muss es zwingen, es zu beenden.
Zum Glück gibt Xcode 4 mir einen Call-Stack meiner App:
%Vor%Das sind alle relevanten Informationen, die mir gerade in den Sinn kommen. Ich habe umfangreiche Recherchen zu Google durchgeführt und einige Threads auf dieser Website gelesen, konnte jedoch keine Lösung finden.
Ich konnte es schließlich dank des oben erwähnten Leitfadens endlich lösen: Hinzufügen eines Settings zu einer iPhone App .
Dort steht:
%Vor%[...] Es ist wichtig zu verstehen, dass solange der Benutzer den Wert der Einstellung nicht ändert, nichts eingestellt ist. Wenn Sie in Ihrer Anwendung nach der Einstellung suchen, gibt sie tatsächlich null zurück, es sei denn, Sie legen einen Standardwert fest. Dazu fügen Sie der applicationDidFinishLaunching (oder didFinishLaunchingWithOptions) -Methode Folgendes hinzu:
Ich war mir dessen nicht bewusst. Außerdem scheint es mir, dass die Werte im NSDictionary in irgendeiner Form initialisiert werden müssen oder auch spätere Änderungen durch den Benutzer nicht wirksam werden (Ich habe immer wieder versucht, die Werte im iPhone Simulator zu ändern, während ich geschaut habe für eine Lösung und es hat nicht funktioniert). Dies betrifft möglicherweise nur den iPhone Simulator, ich hatte jedoch noch keine Gelegenheit, es auf meinem physischen Gerät zu testen. Mein Initialisierungscode sieht nun so aus (im AppDelegate):
%Vor%Mit diesem Code kann ich später leicht auf die NSUserDefaults-Werte in meinem Code zugreifen:
%Vor%Ich habe auch einige Zeit damit verbracht, einen Fehler bezüglich der Reihenfolge der Schlüssel / Wert-Paare des NSDictionary zu finden, bis mir klar wurde, dass der Wert zuerst kommt, gefolgt vom Schlüssel in der Definition. Von einem Perl-Hintergrund her kommend, ist dies etwas fremd für mich, so dass es etwas zu beachten ist, wenn Sie keine Werte von Ihrem NSUserDefaults-Objekt erhalten.
Das hat mich ungefähr drei Tage gekostet, um zu reparieren, also hoffe ich, dass die Lösung für einige nützlich sein könnte. : -)
Der folgende Link war hilfreich für mich, um das Verhalten zu verstehen, das Sie erwähnen, und ich hoffe, dass es Ihnen auch helfen wird. Kurz gesagt, die Standardwerte des Settings-Pakets werden nicht in nsuserdefaults kopiert und müssen manuell registriert werden. Die nsuserdefaults werden nur die letzten Werte widerspiegeln, die der Benutzer in der Einstellungs-App ändert, aber nicht die Standardwerte
Da die JSON-Zeichenfolge von einem PHP-Skript mit GET-Parametern generiert wird, die von meiner App übergeben werden - eine davon die Benutzer-ID aus dem Settings.bundle - ist es nicht verwunderlich, dass dies nicht funktionieren sollte. Es sollte jedoch nicht abstürzen, da ich diesen Fehler früher in meinem Code erhalte, aber das ist wahrscheinlich nicht mit meinem Einstellungsproblem verbunden. Ein echter Schmerz im Nacken ist jedoch die Tatsache, dass Xcode (irgendwie) zusammen mit meiner App im iPhone Simulator abstürzt. Erstens arbeitet Xcode normal weiter, außer dass ich das Programm, das immer noch läuft, nicht abbrechen kann. Ich kann auf den Stop-Button in Xcode klicken, aber ohne Wirkung. Wenn ich versuche, Xcode zu verlassen, fragt es mich, ob es das laufende Programm beenden sollte und wenn ich ja anklicke, stürzt es wirklich ab und ich muss es zwingen, es zu beenden.
Wie oben erwähnt, wurde dies behoben, indem der Debugger in GDB geändert wurde. Es stellte sich auch heraus, dass der Compiler anscheinend nicht mochte, dass ich versuchte, einem NSString, der die Ausnahme ausgelöst hat, einen NULL-Wert zuzuweisen:
%Vor%Ich habe das durch Überprüfung von if ([jsonResponse objectForKey: @ "from"] == nil) behoben und jetzt stürzt meine App zumindest nicht mehr ab. Das NSUserDefaults-Problem besteht jedoch weiterhin.
Ich habe auch das folgende Tutorial konsultiert:
Hinzufügen eines Settings zu einem iPhone App
Ich habe die Standardeinstellungen in meiner Anwendung didFinishLaunchingWithOptions wie in dem Artikel beschrieben, aber ohne Erfolg. Ich kann immer noch nicht auf den Einstellungswert von meinem Code zugreifen.
Ich wäre dankbar für einen Hinweis, der mich in die richtige Richtung führt, da ich völlig ahnungslos bin, was dieses seltsame Verhalten erklären könnte.
Danke!
Tags und Links objective-c xcode4 settings.bundle root.plist