it-swarm.com.de

So lesen Sie die Datenstruktur aus der .plist-Datei in NSArray

Ich habe eine Datenstruktur manuell erstellt und dabei Folgendes verwendet:

NSDictionary* league1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Barclays Premier League", @"name",
                 @"Premier League", @"shortname",
                 @"101", @"id", nil];
NSDictionary* league2 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Coca-Cola Championship", @"name",
                 @"Championship", @"shortname",
                 @"102", @"id", nil];
NSDictionary* league3 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish Premier League", @"name",
                 @"SPL", @"shortname",
                 @"201", @"id", nil];
NSDictionary* league4 = [[NSDictionary alloc] initWithObjectsAndKeys: @"Champions League", @"name",
                 @"UCL", @"shortname",
                 @"501", @"id", nil];

contentArray = [[NSArray alloc] initWithObjects:

                [[NSDictionary alloc] initWithObjectsAndKeys: @"English", @"category", [[NSArray alloc] initWithObjects: league1, league2, nil], @"leagues", nil],
                [[NSDictionary alloc] initWithObjectsAndKeys: @"Scottish", @"category", [[NSArray alloc] initWithObjects: league3, nil], @"leagues", nil],
                [[NSDictionary alloc] initWithObjectsAndKeys: @"Tournaments", @"category", [[NSArray alloc] initWithObjects: league4, nil], @"leagues", nil],
                nil];

[league1 release];
[league2 release];
[league3 release];
[league4 release];

Ich dachte jedoch, dass dies besser wäre, wenn es aus einer Datei gelesen würde. Also habe ich die Datei leagues.plist erstellt, die folgende Struktur hat:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <array>
        <dict>
            <key>category</key>
            <string>English</string>
            <key>leagues</key>
            <array>
                <dict>
                    <key>name</key>
                    <string>Barclays Premier League</string>
                    <key>shortname</key>
                    <string>Premier League</string>
                    <key>id</key>
                    <string>101</string>
                </dict>
                <dict>
                    <key>name</key>
                    <string>Coca-Cola Championship</string>
                    <key>shortname</key>
                    <string>Championship</string>
                    <key>id</key>
                    <string>102</string>
                </dict>
            </array>
        </dict>
        <dict>
            <key>category</key>
            <string>Scottish</string>
            <key>leagues</key>
            <array>
                <dict>
                    <key>name</key>
                    <string>Scottish Premier League</string>
                    <key>shortname</key>
                    <string>SPL</string>
                    <key>id</key>
                    <string>201</string>
                </dict>
            </array>
        </dict>
        <dict>
            <key>category</key>
            <string>Tournaments</string>
            <key>leagues</key>
            <array>
                <dict>
                    <key>name</key>
                    <string>Champions League</string>
                    <key>shortname</key>
                    <string>UCL</string>
                    <key>id</key>
                    <string>501</string>
                </dict>
            </array>
        </dict>
    </array>
</plist>

Wie lese ich diese Datei? Ich habe verschiedene Methoden ausprobiert, aber nichts hat funktioniert. Ich weiß nicht einmal, ob ich die Datei an der richtigen Stelle suche. Als Referenz versuche ich die folgenden Methoden:

NSString* errorDesc = nil;
NSPropertyListFormat format;
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
NSData* plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
contentArray = (NSArray*)[NSPropertyListSerialization
                                     propertyListFromData:plistXML
                                     mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                     format:&format
                                     errorDescription:&errorDesc];

if (!contentArray) {
    NSLog(errorDesc);
    [errorDesc release];
}

oder

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentArray = [NSArray arrayWithContentsOfFile:plistPath];

oder

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];

NSString *fooPath = [documentsPath stringByAppendingPathComponent:@"leagues.plist"];
NSLog(fooPath);
contentArray = [NSArray arrayWithContentsOfFile:fooPath];
NSLog(@"%@",contentArray);

Das macht mich endlich total verrückt. Hilfe bitte!

Dankesehr

49
Xetius
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"league" ofType:@"plist"];
contentDict = [NSDictionary dictionaryWithContentsOfFile:plistPath];

Diese Antwort ist richtig - sind Sie sicher, dass sich Ihre Datei in der App befindet? Haben Sie es zu Ihrem Projekt hinzugefügt und überprüft, ob es in Ihr App-Paket kopiert wird? Wenn nicht, könnte es sein, dass die Datei nicht zu dem erstellten Ziel hinzugefügt wurde. Dies ist ein einfacher Fehler, insbesondere wenn Sie mehrere Ziele haben.

Verwenden Sie diesen Code, wenn sich plist im Ressourcenordner des Projekts befindet.

  NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"league"    ofType:@"plist"];
 contentArray = [NSArray arrayWithContentsOfFile:sourcePath];

Wenn sich plist im Dokumentverzeichnis der App befindet, verwenden Sie Folgendes:

    NSArray *paths = 
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

NSString *plistName = @"league";
NSString *finalPath = [basePath stringByAppendingPathComponent: 
                       [NSString stringWithFormat: @"%@.plist", plistName]];



contentArray = [NSArray arrayWithContentsOfFile:finalPath];
4
Narayanan

Ich hatte dieses Problem, aber es funktionierte nicht, da ich die Ergebnisse der pList in ein Array legte, in dem es ein Wörterbuch hätte sein sollen, d. H

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"VehicleDetailItems" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
4
noRema

Der Vollständigkeit halber sind Kendall und Bentford völlig korrekt. In meinem Beispiel war contentArray jedoch eine Eigenschaft, und am Ende der Methode wurde der Gültigkeitsbereich überschritten, da arrayWithContentsOfFile ein automatisch freigegebenes Objekt erstellt.

Um dies richtig zu machen, musste ich 3 Dinge tun:

  1. legen Sie die Datei im Ressourcenordner ab

  2. benennen Sie die Datei korrekt (vorher war leagues.plist anstelle von league.plist)

  3. lesen Sie die Datei mit [[NSArray-Zuordnung] initWithContentsOfFile: plistPath)];

der dritte Teil erstellt ein zugewiesenes NSArray, das nicht freigegeben wird, wenn Sie den Gültigkeitsbereich dieser Funktion beenden. Natürlich musste dies in der Dealloc-Funktion freigegeben werden.

2
Xetius

Kendall ist richtig. 

Meiner Erfahrung nach müssen Sie Ihre Datei zum Ordner "Resources" in xcode hinzufügen.

2
bentford

Einfach nur hinzufügen. Ich hatte das gleiche Problem und die vorgeschlagene Lösung half mir, das Problem zu lösen. Ich bin mir jedoch nicht sicher, ob ich die genaue Lösung tatsächlich verwendet habe. In meinem Fall bestand das Problem darin, dass die .plist-Datei zu einem anderen Ziel hinzugefügt wurde (hatte zuvor ein neues Ziel hinzugefügt). Daher war die Lösung .plist> Get Info> Targets. Stellen Sie sicher, dass sie zum richtigen Ziel hinzugefügt wird, damit sie bei der Installation auf das Gerät kopiert wird. Verdammt, ich hätte das schon früh herausgefunden, ich hätte viel Zeit gespart. Ich hoffe, das ist auch hilfreich. Grüße!

0
Bob B.

Dieser Kodex funktioniert 

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"];
NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath];
NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);
0
Mohit Gaur

Wenn die Datei nicht im Ressourcenordner hinzugefügt und nur in Ihrem Dokumentenverzeichnis abgelegt wird, können Sie dies tun 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.plist"];
NSMutableArray *arrContentsplist = [[NSMutableArray alloc] initWithContentsOfFile:path];
0
Taimur Ajmal