2010-04-14 9 views
4

Je lis dans une plist à partir d'un serveur web, généré avec un peu de php. Quand je lis cela dans un NSArray dans mon application iphone, puis que je crache NSARray avec NSLog pour le vérifier, je vois que les valeurs float sont traitées comme des chaînes. Je voudrais que les valeurs de "distance" soient traitées comme numériques et non comme des chaînes. Ce plist est affiché dans une vue de table où il peut être trié par la distance, mais le problème est que la distance est triée comme une chaîne, ainsi j'obtiens quelques résultats de tri drôles. Puis-je convertir les valeurs de distance en float à partir d'une chaîne de NSArray? Ou peut-être y a-t-il une solution plus simple comme ajuster la définition de plist, ou peut-être quelque chose dans le code NSMutableURLRequest?Comment gérer les valeurs float dans un plist

Mon plist ressemble à ceci:

<?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>name</key> 
    <string>Pizza Joint</string> 
    <key>distance</key> 
    <string>2.1</string> 
    </dict> 
    <dict> 
    <key>name</key> 
    <string>Burger Kang</string> 
    <key>distance</key> 
    <string>5</string> 
    </dict> 
</array> 
</plist> 

Après avoir lu dans un NSArray, il ressemble à ceci par NSLog:

result: (
     { 
     distance = "2.1"; 
     name = "Pizza Joint"; 
     }, 
     { 
     distance = 5; 
     name = "Burger Kang"; 
     } 
    ) 

Voici le code Objective-C récupère le plist:

// Set up url request 
// postData and postLength are left out, but I can post in this question if needed. 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:@"http://mysite.com/get_plist.php"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData];  


NSError *error; 
NSURLResponse *response; 
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *string = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]; 
// libraryContent is an NSArray 
self.libraryContent = [string propertyList]; 
NSLog(@"result: %@", self.libraryContent); 

Répondre

10

Vous pouvez utiliser le real de type clé dans vos fichiers plist, par exemple:

<?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"> 
<dict> 
     <key>value</key> 
     <real>1</real> 
</dict> 
</plist> 
+0

merci Noah et Martin! Belle solution facile. – Banjer

1

Utilisez l'élément <real>, non <string>.

3

Ce tableau répertorie les types possibles que vous pouvez utiliser dans un plist:

Table 2-1: Property list types and their various representations

+1

La page a apparemment été déplacée. Je l'ai trouvé ici: https: //developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html –

+0

Merci @ScottCarter - mis à jour l'url. – Banjer

Questions connexes