1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

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

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Westbär, 24.07.08.

  1. Westbär

    Westbär Weißer Winterglockenapfel

    Dabei seit:
    06.04.07
    Beiträge:
    882
    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ß
     
  2. gert

    gert Macoun

    Dabei seit:
    19.08.05
    Beiträge:
    118
  3. Westbär

    Westbär Weißer Winterglockenapfel

    Dabei seit:
    06.04.07
    Beiträge:
    882
    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ß
     
  4. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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.
     
  5. Westbär

    Westbär Weißer Winterglockenapfel

    Dabei seit:
    06.04.07
    Beiträge:
    882
    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ß
     
  6. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ist denn der Wert als String gespeichert?
     
  7. Westbär

    Westbär Weißer Winterglockenapfel

    Dabei seit:
    06.04.07
    Beiträge:
    882
    Müsste so sein, würd ichs mit nem Integer probieren (also @"" weglassen) kommen Fehler das es Inkompatibel. Mach ich jedoch authThing zu einem NSInteger kommen mir gleich 3 neue Warnungen.
     
  8. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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.
     
    Rosi-janni gefällt das.
  9. gert

    gert Macoun

    Dabei seit:
    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
     
  10. Westbär

    Westbär Weißer Winterglockenapfel

    Dabei seit:
    06.04.07
    Beiträge:
    882
    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ß
     
    #10 Westbär, 01.08.08
    Zuletzt bearbeitet: 01.08.08
  11. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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?!
     
  12. gert

    gert Macoun

    Dabei seit:
    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.
     
  13. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ich muss mich jedes Mal erinnern, dass er nicht User-Defaults meint.
     
  14. gert

    gert Macoun

    Dabei seit:
    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 :)
     
  15. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    "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.
     
  16. gert

    gert Macoun

    Dabei seit:
    19.08.05
    Beiträge:
    118
    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.
     

Diese Seite empfehlen