Comment lire la structure des données du fichier .plist dans NSArray
-
09-09-2019 - |
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
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:
-
placer le fichier dans le dossier des ressources
-
nom correctement le fichier (était leagues.plist au lieu de league.plist)
-
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"]);