• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> 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ß
 

Westbär

Weißer Winterglockenapfel
Registriert
06.04.07
Beiträge
881
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ß
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.
 

Westbär

Weißer Winterglockenapfel
Registriert
06.04.07
Beiträge
881
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ß
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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?
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Entschuldige, dass ich das so sage: Du musst etwas Grundlegendes & Einführendes lesen. So hat das keinen Nährwert.
 
  • Like
Reaktionen: Mitglied 26876

gert

Macoun
Registriert
19.08.05
Beiträge
118
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
 

Westbär

Weißer Winterglockenapfel
Registriert
06.04.07
Beiträge
881
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:

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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?!
 

gert

Macoun
Registriert
19.08.05
Beiträge
118
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.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Ich muss mich jedes Mal erinnern, dass er nicht User-Defaults meint.
 

gert

Macoun
Registriert
19.08.05
Beiträge
118
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 :)
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
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.
 

gert

Macoun
Registriert
19.08.05
Beiträge
118
"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.