49 votes

Comment lire les données de la structure .fichier plist dans NSArray

J'ai été la création d'une structure de données manuellement à l'aide de l'suivantes:

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, j'ai pensé que ce serait mieux si elle était lue à partir d'un fichier. J'ai donc créé le fichier des ligues.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 en. J'ai essayé plusieurs méthodes mais rien n'a fonctionné. Je ne sais même pas si je suis au bon endroit pour le fichier. Pour référence, je suis en train d'essayer 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);

C'est enfin la conduite m'a complètement fou. De l'aide s'il vous plaît!

Merci de bien vouloir

121voto

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

Cette réponse est correcte - êtes-vous sûr que votre fichier dans l'application? Avez-vous l'ajouter à votre projet et vérifier pour voir si il est copié dans votre app bundle? Si pas, il peut être le fichier n'a pas été ajouté à la cible que vous construisez, une erreur facile à faire surtout si vous avez plusieurs cibles.

4voto

Narayanan Points 475

Utiliser ce code si l' plist est dans le dossier des ressources du projet.

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

Si l' plist est à l'intérieur du répertoire de documents de l'application utilisez 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];

4voto

noRema Points 378

J'ai eu ce problème, mais il ne fonctionnait pas parce que j'ai été mettre les résultats de la pList dans un tableau où il doit avoir été un dictionnaire, je.e

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

2voto

bentford Points 9981

Kendall est correct.

Dans mon expérience, vous devez ajouter votre fichier à la rubrique "Ressources" dans le dossier de xcode.

2voto

Xetius Points 10445

Pour être complet, Kendall et bentford sont tout à fait correct. Cependant, dans mon exemple, contentArray était un bien et d'ici la fin de la méthode qu'il allait hors de portée parce que arrayWithContentsOfFile crée une auto-publié objet.

Pour faire ce travail correctement j'avais besoin de faire 3 choses:

  1. mettre le fichier dans le dossier de ressources

  2. nom du fichier correctement (était ligues.plist au lieu de ligue.plist)

  3. lire le fichier à l'aide de [[NSArray alloc] initWithContentsOfFile:plistPath)];

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X