• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Plist auslesen?

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Hallo,

ich stehe vor dem Problem das ich einen String aus einer Plist mit einem aus der Methode übergebenen String vergleichen möchte und mittels der IF Schleife dann auf den jeweiligen Fall reagiere.
Bin noch Objektive C Anfänger.
Habe es über mehrere verschiedene Wege versucht, bin der Meinung hiermit bin ich nah dran:

Code:
-(NSString*)choose:(NSString*)name
{



    NSString* plistPath = [[NSBundlemainBundle] pathForResource:@"NamenM"ofType:@"plist"];

    NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

  

    NSArray* array = [[NSArray alloc]initWithObjects:dic, nil];

  

    BOOL a = [array containsObject:name];

  

    if (a == YES)

    {

        name = @"Männlich";

    }

  /**

    else if (b == YES)

    {

        name = @"Weiblich";

    }

  **/

    else

    {

        name = @"not Found";

    }

return name;
}

Wäre um jede Hilfe dankbar.
 

frostdiver

Zwiebelapfel
Registriert
19.06.12
Beiträge
1.285
1. containsObject: Im NSArray array befindet sich nach deinem Code genau ein Objekt. Und das ist dic. Die Abfrage macht also keinen Sinn.
2. auch in deinem dic wird sich kein Objekt befinden, welches identisch ist mit name.
also einmal über dein dic iterieren und mit isEqualToString nach Gleichheit suchen.
 

lx88

Stina Lohmann
Registriert
02.09.09
Beiträge
1.027
Ich weiß man hört es nicht gern, aber ich musste es irgendwann auch einsehen. Vielleicht wäre es hilfreich wenn du dich zunächst einmal mit mit den theoretischen Konzepten der Programmierung vertraut machst. Denn eine IF-Abfrage ist keine Schleife :)
 

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
@ Ix88 ohh ja ...da hab ich mich vertan, ich habe java gelernt aber mit objektive c habe ich so meine Probleme.

Wie kann ich denn Strings aus einer PList auslesen bzw. prüfen ob es einen String mit einem Bestimmten Inhalt in der PList gibt?

Blicke in den API´s nicht so ganz durch.
 

lx88

Stina Lohmann
Registriert
02.09.09
Beiträge
1.027
Da ich nicht genau wusste worauf du mit deinem Beispiel hinaus wolltest, habe ich mal ein kleines Beispiel angefertigt.

Diese Methode kannst du direkt in deine AppDelegate.m kopieren:

Code:
- (void)checkPlistWithName:(NSString *)name forOccurrenceOf:(NSString *)text
{
    BOOL objectIncluded = NO;
    NSDictionary *plistContent = [NSDictionary dictionaryWithContentsOfFile:name];
    for (NSString *key in [plistContent allKeys]) {
        NSString *valueForKey = [plistContent valueForKey:key];
        if ([valueForKey isEqualToString:text]) {
            objectIncluded = YES;
            NSLog(@"Item: %@ für Schlüssel: %@ gefunden", valueForKey, key);
        }
    }
    if (!objectIncluded) {
        NSLog(@"Es wurde kein Eintrag mit dem Suchbegriff: %@ gefunden", text);
    }
}

Innerhalb dieser Methode wird die eigentliche Logik abgebildet. Neben dem Aufruf "allKeys" existiert auch der Aufruf "allValues" wenn es dich nicht wirklich interessiert, zu welchem Schlüssel der gesuchte Wert hinterlegt wurde.

Diese Methode kannst du beispielsweise innerhalb der Methode "application didFinishLaunchingWithOptions …" aufrufen:

Code:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
   
   
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"README" ofType:@"plist"];
    [self checkPlistWithName:plistPath forOccurrenceOf:@"Hello World"];
    [self checkPlistWithName:plistPath forOccurrenceOf:@"Hello Jupiter"];
   
    return YES;
}

Damit das ganze funktioniert muss innerhalb deines Projekts eine plist-Datei mit ebendiesem Namen existieren.

Kleine Anmerkung zu deinem Code von oben: Falls du vor hast über diese plist-Datei ein Geschlecht des Benutzers zu hinterlegen (unabhängig davon ob es dazu nicht vll. geeignetere Methoden des Speicherns gibt) kannst du dir dafür ja auch einfach einen sprechenden Schlüssel (beispielsweise: "gender") in der plist hinterlegen. Dann ersparst du dir das Iterieren.

Viele Grüße
 

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Vielen vielen Dank, das hat mir wirklich weiter geholfen.

Hier ist die fertige Methode:
Code:
-(NSString*)choose:(NSString*)name
{
    BOOL objectIncluded = NO;
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"NamenM" ofType:@"plist"];
    NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
    NSString* return_name;
    for (NSString *key in [dic allKeys])
    {
        NSString *valueForKey = [dic valueForKey:key];
        if ([valueForKey isEqualToString:name]) {
            objectIncluded = YES;
       
           return_name = @"Männlich";
        }
        else if (!objectIncluded)
        {
            return_name = @"Eintrag wurde nicht gefunden";
        }
    }
   
    return return_name;
}

@end
 

lx88

Stina Lohmann
Registriert
02.09.09
Beiträge
1.027
Zwei "mini" Anmerkungen:
1) Generell hat sich für Variablennamen eher die Verwendung von "lowerCamelCase" eingebürgert. Also returnValue statt return_value.

2) Wieso gibst du deinen wert nicht direkt zurück sobald du ihn gefunden hast? Sonst läufst du ja erst noch die ganze Schleife ab.
 

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Weil noch 2 else if abfragen hinzu kommen(Wenn z.B. bestimmte Namen etc. abgefragt werden). Mit fertiger Methode meinte ich das mein eigentliches Problem in der Methode behoben wurde und so wie es in der Methode steht funktioniert.

Nochmals vielen Dank.
 

lx88

Stina Lohmann
Registriert
02.09.09
Beiträge
1.027
Ok. Gern geschehen :)
Dann macht es ja auch wenig Sinn obigen Code im Detail zu analysieren. Auch wenn dein erstes else if solange jedes mal aufgerufen wird bis du einen Wert gefunden hast. Und solange setzt rufst du jedes mal auch die Zuweisung return_name = @"Kein ..." auf.

Falls du bezüglich deiner fertigen Lösung Feedback haben möchtest, kannst du dich ja hier melden. ;)