Question

Je suis en train de créer une structure de données manuellement à l'aide de ce qui suit:

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];

Cependant, je pensais que ce serait mieux si elle a été lu à partir d'un fichier. Donc, j'ai créé le fichier leagues.plist qui a la structure suivante:

<?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>

Comment puis-je lire ce fichier. Je l'ai essayé différentes méthodes, mais rien n'a fonctionné. Je ne sais même pas si je suis à la recherche dans le bon endroit pour le fichier. Pour référence, je suis en train les méthodes suivantes:

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];
}

ou

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

ou

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);

Ceci est enfin complètement fou me conduit. Aide s'il vous plaît!

Merci de bien vouloir

Était-ce utile?

La solution

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

Cette réponse est correcte - êtes-vous sûr que votre fichier est dans l'application? Avez-vous ajouté à votre projet, et de vérifier pour voir si elle est copiée dans votre paquet d'application? Dans le cas contraire, il pourrait être le fichier n'a pas été ajouté à la cible que vous construisez, une erreur facile à faire surtout si vous avez plusieurs cibles.

Autres conseils

Utilisez ce code si le plist est dans le dossier des ressources du projet.

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

Si le plist se trouve dans le répertoire de documents de l'application utiliser ceci:

    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];

J'ai eu ce problème, mais ça ne marchait pas parce que je mettais les résultats de la pList dans un tableau où il aurait dû être un dictionnaire, i.e.

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

Kendall est correct.

Dans mon expérience, vous devez ajouter votre fichier dans le dossier « Ressources » dans Xcode.

Pour être complet, Kendall et bentford sont tout à fait correct. Cependant, dans mon échantillon, contentArray était une propriété et à la fin de la méthode qu'il allait hors de portée, car arrayWithContentsOfFile crée un objet libéré automatiquement.

Pour faire ce travail correctement que je devais faire 3 choses:

  1. placer le fichier dans le dossier des ressources

  2. nom correctement le fichier (était leagues.plist au lieu de league.plist)

  3. lire le fichier en utilisant [[NSArray alloc] initWithContentsOfFile: plistPath)];

la troisième partie crée un alloué NSArray qui ne libère pas lorsque vous quittez le cadre de cette fonction ... bien sûr, cela devait être libéré dans la fonction dealloc.

Il suffit d'ajouter. J'ai eu le même problème et la solution proposée m'a aidé à résoudre le problème, mais je ne sais pas si je réellement utilisé la solution exacte. Dans mon cas, le problème est que le fichier .plist a été ajouté à une cible différente (avait ajouté un moment avant une nouvelle cible). Par conséquent, la solution a été .plist>> Informez-vous sur les cibles, et assurez-vous qu'il est ajouté à la cible correcte il est copié sur l'appareil lors de l'installation. Zut avais-je comprendre cela assez tôt, je l'aurais sauvé beaucoup de temps. Espérons que cela est utile aussi. Cordialement!

Si le fichier est ajouté dans le dossier des ressources et seulement placé dans votre répertoire de documents. Vous pouvez le faire

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

Ce code fonctionne

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plist-name" ofType:@"plist"];
NSDictionary *Dictionary= [[NSDictionary alloc]initWithContentsOfFile:plistPath];
NSLog(@" current version CFBundleVersion = %@",[Dictionary valueForKey:@"CFBundleVersion"]);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top