2012-01-02 4 views
2

Tout d'abord, désolé pour mon anglais ... Je veux écrire un programme qui va calculer les distances entre deux villes. Par exemple, dans UITextField, nous écrivons Paris, et dans le second UITextField, nous écrivons le second, "London", et nous avons une base de longitude s et de latitude s de toutes les Cities, notre programme a une formule de distance qui utilise ces quatre nombres. Quand l'utilisateur insère un nom dans UITextField je veux prendre ce .text et le comparer avec notre base Comment faire ça? Je peux faire un programme comme celui-ci mais c'est .... stupide:UITextField et programme intéressant

@interface City : UIViewController{ 

    IBOutlet UITextField *city1; 

    IBOutlet UITextField *city2; 
} 

@property (nonatomic, retain) IBOutlet UITextField *city1; 
@property (nonatomic, retain) IBOutlet UITextField *city2; 

-(void) calculate; 

@end 




#import "City.h" 

@implementation City 

@synthesize city1, city2; 

-(void) viewDidLoad 
{ 
    // to check changes in textfields i`m using NSTimer, I know it`s stupid but I haven`t learned how to make it in different way 

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(calculate) userInfo:nil repeats:YES]; 

} 

-(void) obliczenia 
{ 
    double distance; 


    if([city1 is EqualToString:@"Paris"] && [city2 is EqualToString:@"London"]) 
    { 

     double Paris_lat = x1; 
     double Paris_lon = y1; 
     double London_lat = x2; 
     double London_lon = y2; 

     distance =...; // we know the formula for distance but this is not important for now. 
       // distance shows in some label but this is not a point of my problem. 

    } 
} 

Il fonctionne, mais quand nous avons quelques villes, mais quand nous avons mille villes, le code écrit serait un Nonsens

Je commence avec.. Programmation iPhone Merci pour votre patience et s'il vous plaît, aidez-moi. C'est très important mais je ne trouve pas de solution.

+0

http://stackoverflow.com/a/388584/413443 Voici une meilleure façon d'écouter les changements dans les champs de texte. –

Répondre

0

Vous pouvez créer un tableau avec tous les noms de pays et comparer chaque nom de pays dans le tableau avec votre entrée.

NSArray *countries = [NSArray arrayWithObjects:@"Berlin", @"Rom", nil]; 

    for (NSString *c in countries) { 
    if ([city1 isEqualToString:c]) { 
     //do something 
    } 
    } 
+0

Ceci n'est pas utile car les données ne sont pas associées aux noms. –

+1

oui, donc le meilleur truc est la solution de @PhilippeSabourin – CarlJ

+0

Je pense que c'est ce que le commentaire: '// faire quelque chose 'est pour. Les gens peuvent remplir les blancs par eux-mêmes. – msgambel

1

Vous êtes probablement mieux d'utiliser une vue de sélecteur pour afficher les villes disponibles, ou utiliser une recherche en direct dans votre textview à saisie semi-automatique, ou de fournir des sélections pour vos villes.

Si vous avez un ensemble contraint d'entrées (dans ce cas, les noms des villes pour lesquelles vous avez des valeurs longues, lat), il est préférable de contraindre l'entrée de l'utilisateur à ces valeurs.

+0

Je suis d'accord que ce serait également une meilleure interface. –

+0

Merci! Oui, dans ce cas, les champs de texte seront une meilleure solution. – Milosz

4

Jetez un oeil à ce guide: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html

Fondamentalement, mettre toutes vos données dans une liste de propriétés, comme ceci:

<dict> 
    <key>Paris</key> 
    <dict> 
     <key>x</key> 
     <real>20.2</real> 
     <key>y</key> 
     <real>30.4</real> 
    </dict> 
... 
</dict> 

Et puis chargez comme ceci:

NSDictionary * data = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NAMEOFPLIST" ofType:@"plist"]]; 
NSDictionary * paris = [data objectForKey:@"Paris"]; 
float xparis = [[paris objectForKey:@"x"] floatValue]; 
float yparis = [[paris objectForKey:@"y"] floatValue]; 

Dans votre cas, vous devriez faire quelque chose comme ceci:

NSDictionary * data = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NAMEOFPLIST" ofType:@"plist"]]; 
NSDictionary * city1Data = [data objectForKey:city1.text]; 
NSDictionary * city2Data = [data objectForKey:city2.text]; 
if (city1Data != nil && city2Data != nil) { 
    // Do what you need... 
} 

Ensuite, faites ce dont vous avez besoin avec les données.

+0

Merci Philippe! Je pense que cette solution est ce dont j'ai besoin. J'ai essayé cela et (aussi j'ai essayé de tout comprendre à propos de plist) (propably) nous ne pouvons pas utiliser mais seulement (qui est flottant) ou . J'ai raison, n'est-ce pas? Et nous ne pouvons pas non plus utiliser: double xparis = [paris objectForKey: @ "x"]; mais float xparis - [[paris objectForKey: @ "x"] floatValue]; – Milosz

+0

Ouais je devinais la double chose, ça sonne bien. Vous pouvez le convertir en un flottant de cette façon, oui. Je vais modifier ma réponse. –

+0

Aussi, vous comprenez que vous ne nommez pas spécifiquement Paris n'importe où dans votre code, n'est-ce pas? Vous diriez NSDictionary * city = [data objectForKey: city1]; et vérifiez si c'est nul.Si ce n'est pas vous savez que c'est une ville légitime. Je vais ajouter cela aussi. –