• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Property List (Info.plist) per Cocoa ändern?

Westbär

Weißer Winterglockenapfel
Registriert
06.04.07
Beiträge
881
Huhu,

Ich hab meine Info.plist mit einem Eintrag erweitert und will den gerne von 0 auf 1 setzen.
Wie mach ich das in Objective-C/Cocoa? Ich hab die Dokumentation schon durchforstet, finde dort aber nicht das, was ich brauche. Gibts irgendeinen Einzeiler, wie beim Auslesen der den Wert von 0 auf 1 ändert?

Danke schonmal,

Gruß
 
Gibt es auch einen Weg den Inhalt per if() zu prüfen?

Ich lese derzeit so aus
Code:
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"clickedOnButton"]

Nur irgendwie gibt er mir bei einer IF immer das else-statement aus obwohl der Key auf 1 steht.

Code:
if([[[NSBundle mainBundle] infoDictionary] objectForKey:@"clickedOnButton"] == @"1") {
     NSLog(@"clicked");
} else {
     NSLog(@"not clicked");
}

Gruß
 
Du üüberprüfst die Existenz des Objektes. Wenn es existiert, ist der Rückgabewert nicht nil (aka 0) und du landest im Else-Zweig.

Um den Wert zu ürfen, musst du
- entweder noch -boolValue an das zurückgegebene Objekt versenden

- oder -isEquualTo… verwenden.
 
Ich habe nun isEqualTo verwendet, nur seitdem hört dann das ändern der plist auf.
Code:
	NSString *clickThing = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"clickedOnButton"];
	
	if([clickThing isEqualTo:@"1"]) {	
		NSLog(@"clicked");
	} else {
	        NSLog(@"not clicked");
                [self changeClickedStatus];
	}

Also bei "not clicked" sollte es sich dann auf 1 ändern, was es seit dem benutzen von isEqualTo nicht mehr macht.

Weiß wer mehr dazu?

Gruß
 
Ich habe nun isEqualTo verwendet, nur seitdem hört dann das ändern der plist auf.
Code:
	NSString *clickThing = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"clickedOnButton"];
	
	if([clickThing isEqualTo:@"1"]) {	
		NSLog(@"clicked");
	} else {
	        NSLog(@"not clicked");
                [self changeClickedStatus];
	}

Also bei "not clicked" sollte es sich dann auf 1 ändern, was es seit dem benutzen von isEqualTo nicht mehr macht.

Weiß wer mehr dazu?

Gruß

Ist denn der Wert als String gespeichert?
 
Entschuldige, dass ich das so sage: Du musst etwas Grundlegendes & Einführendes lesen. So hat das keinen Nährwert.
 
  • Like
Reaktionen: Mitglied 26876
hmm.
also es gibt so 2-3 buecher, die jedem sehr ans herz zu legen sind, der mit objective-c und in dem kontext auch cocoa anfaengt.

meine favs fuer den einstieg nach wie vor:
- cocoa programming for mac os x (aaron hillegass)
- programming in objective-c (stephen kochan)
- objective-c und cocoa (amin negm-awad)

links gibts dazu genuegend hier im forum :)

beste gruesse,
.gert
 
Das Hillegass hab ich bereits.
Werd das mal genauer studieren.


Danke für alles :)
Gruß

EDIT://
Ich habe mir nun das ganze etwas genau angesehen, bin aber noch immer zu keiner Lösung gekommen.

In der Info.plist ist "clickedOnButton" ein String. (ich hab jetzt mal statt 0 und 1, false und true verwendet)
Code:
	<key>clickedOnButton</key>
	<string>false</string>

Ich lese folgendermaßen (was auch funktioniert):
Code:
	NSString *auths = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"clickedOnButton"];
	NSLog(auths);

	if([auths isEqualTo:@"true"]) {
		NSLog(@"clicked");
	} else {
		NSLog(@"not clicked");
	}

Und hiermit schreibe ich den Wert
Code:
				NSMutableDictionary *dictAuth = [NSMutableDictionary dictionaryWithContentsOfFile:@"Info.plist"];
				[dictAuth setObject:@"true" forKey:@"clickedOnButton"];
				[dictAuth writeToFile:@"Info.plist" atomically:YES];

Ich sehe das Problem nicht. clickedOnButton ist ein String und da es kein setString: gibt, müsste setObject funktionieren, da es laut der Doku ja nur setBool, setInteger, setFloat und setObject gibt.

Gruß
 
Zuletzt bearbeitet:
Zunächst solltest du eine NSNumber-Instanz verwenden, welche ein Bool enthält: -numberWithBool:, -boolValue. Hiermit kannst u dann auch unmittelbar in den If herein.

Ich verstehe mittlerweile dein Problem nicht mehr?!
 
interessant zu wissen waere ja auch, warum das unbedingt in die info.plist soll bzw. was da gespeichert und dann geladen werden soll. wenns um den state fuer nen button geht dann wuerd ich ne action auf den button legen..so in der art wenn man folgendes hat:

#define kMyButtonState @"kMyButtonState"
und
IBOutlet NSButton *myButton;

Code:
- (IBAction)saveButtonState:(id)sender
{
    NSNumber *buttonState = [NSNumber numberWithInt:[sender state]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ( defaults )
    {
	[defaults setObject:buttonState forKey:kMyButtonState];
	[defaults synchronize];
    }
}

- (void)loadButtonState
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ( defaults )
    {
        NSNumber *buttonState = [defaults objectforKey:kMyButtonState];
        if ( buttonState != nil)
        {
            [myButton setState:[buttonState intValue]];
	}
    }
}
weil irgendwie klingt das ja auch nach nem job fuer nsuserdefaults.
 
Hmm. Sollte ich vielleicht auch mal tun :)
Aaber ob nun in die Defaults oder in ne andere plist... entscheidend ist wohl die Frage, wie er nun den State seines Buttons in irgendwo reingeschrieben und dann wieder rausgelesen bekommt.
Warum auch immer das in der Info.plist geschehen soll :)
 
Und hiermit schreibe ich den Wert
Code:
				NSMutableDictionary *dictAuth = [NSMutableDictionary dictionaryWithContentsOfFile:@"Info.plist"];
				[dictAuth setObject:@"true" forKey:@"clickedOnButton"];
				[dictAuth writeToFile:@"Info.plist" atomically:YES];

"Info.plist" ist ein zum aktuellen Arbeitsverzeichnis relativer Pfad (vgl. [NSFileManager currentDirectoryPath]). Wo erwartest Du die Datei?

Abgesehen davon stimme ich zu: Die NSUserDefaults bieten sich an wie sauer Bier; und es ist eine schlechte Idee, in die Info.plist zu schreiben, wenn's nicht unbedingt sein muss.

Wenn's dann doch unbedingt sein muss, dann rate ich zu einem fuer Dich spezifischen Praefix, z.B. im einfachsten Fall "WBClickedOnButton", aber moeglichst noch Anwendungs-spezifischer. Man bekommt naemlich echte Probleme, wenn man einen Schluessel verwendet, von dem Apple sich spaeter mal ueberlegt, den selbst verwenden zu wollen.
 
"Info.plist" ist ein zum aktuellen Arbeitsverzeichnis relativer Pfad (vgl. [NSFileManager currentDirectoryPath]). Wo erwartest Du die Datei?

na gut.. ich ging mal davon aus, dass das klar sei. Von daher ist (wenns denn unbedingt _die_ Info.plist sein soll) der Weg ueber NSBundle der bessere.

Sonst freu ich mich weiter ueber das 'saure Bier'.. hoffe die Feierabendvariante, welche los Kollegas et moi jetzt zu uns nehmen werden ist da eher herb ;)

Schoenes Wochenende somit schonmal fuer euch.