2013-04-28 2 views
0

Je l'ai déjà fait une application qui compare l'emplacement de l'utilisateur à un réseau d'emplacements au format ...Créer une matrice de coordonnées de l'emplacement Dynamiquement

NSArray *myStationArray; 

myStationArray = @[ 
       @{ 
        kStation : @"27200", 
        kLatitude : @(41.656467), 
        kLongitude : @(-81.277963) 
        }, 
       @{ 
        kStation : @"27650", 
        kLatitude : @(41.657118), 
        kLongitude : @(-81.276545) 
        }, 
        ... 

Maintenant, je veux que l'utilisateur pour pouvoir créer ce tableau dynamiquement où ils peuvent sélectionner un bouton IBAction qui va ajouter leur emplacement actuel (lat long) à un tableau mutable avec le format indiqué. La valeur de kStation sera entrée par l'utilisateur. Je sais que les questions conceptuelles sont mal vues et je vais donc proposer ces questions spécifiques basées sur cette idée.

1.) Où dois-je créer le tableau mutable (viewDidLoad, IBAction, didUpdateToLocation, ect.)? Il devra être enregistré dans l'application afin que l'utilisateur puisse en ajouter et en supprimer tout au long de sa vie. 2. A quoi ressemblera mon code IBAction pour enregistrer l'emplacement actuel et l'entrée kStation pour créer un tableau correspondant à l'exemple ci-dessus?

3.) Est-ce quelque chose où vous voudriez utiliser une base de données telle que sqlite? Je préférerais éviter d'utiliser une base de données si possible mais j'aimerais connaître la meilleure méthode pour le faire.

Nous vous remercions de votre temps à l'avance.

Répondre

0

Vous définiriez probablement cette NSMutableArray pour votre liste comme une propriété de classe:

@property (nonatomic, strong) NSMutableArray *stations; 

Pendant que vous y êtes, vous pouvez définir une propriété NSString pour votre nom:

@property (nonatomic, strong) NSString *filename; 

Vous pourrait charger les valeurs précédentes ou l'initialiser en viewDidLoad, où kFilename est réglé sur @"stations.plist" ou quelque chose comme ça:

NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
self.filename = [docsPath stringByAppendingPathComponent:kFilename]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:self.filename]) 
    self.stations = [NSMutableArray arrayWithContentsOfFile:self.filename]; 
else 
    self.stations = [NSMutableArray array]; 

Vous pouvez ajouter de nouvelles valeurs dans votre IBAction (si vous souhaitez ajouter lorsque l'utilisateur clique sur le bouton) ou didUpdateToLocation (si vous voulez qu'il soit ajouté automatiquement l'utilisateur se déplace). Par exemple, si vous l'avez fait dans IBAction:

- (IBAction)didTouchUpInsideAddButton:(id)sender 
{ 
    NSDictionary *newItem = @{ 
        kStation : ..., // grab your station identifier however you want to do that 
        kLatitude : @(self.locationManager.location.coordinate.latitude), 
        kLongitude : @(self.locationManager.location.coordinate.longitude) 
       }; 
    [self.stations addObject:newItem]; 

    [self.stations writeToFile:self.filename atomically:YES]; 
} 

Si votre liste de stations est susceptible d'obtenir un grand, alors vous voudrez peut-être envisager d'utiliser Core Data ou SQLite, mais si cette liste est susceptible d'être raisonnablement court (c'est-à-dire quelque chose que cela ne vous dérange pas de charger le tout dans la mémoire en même temps), la technique ci-dessus d'utiliser plists via arrayWithContentsOfFile et writeToFile est probablement suffisante.

+0

Merci pour votre respo nse. Le réseau comprendra probablement de 5 à 80 stations dont la plupart se trouvent dans la plage de 5 à 30. Combien considérez-vous comme maximum en utilisant cette approche? Aussi, avez-vous un commentaire sur l'autre réponse fournie par rapport à la vôtre? Je vais regarder dans les deux réponses et vous laisser savoir comment ça se passe. – JBeesky

+0

@JBeesky - Les deux solutions sont similaires, en ajoutant des objets au tableau mutable et en lisant et en écrivant un plist. 80 stations est bien dans les limites pratiques d'un plist. – Rob

0

Pour répondre à vos questions dans l'ordre:

1) Vous auriez probablement eu envie de créer et initialiser votre NSMutableArray dans viewDidLoad.

2) Vous pouvez soit créer votre propre classe, quelque chose de similaire comme le format MKAnnotation ou créer un dictionnaire et bâton dans un tableau comme ceci:

-(IBAction)myButtonAction:(id)sender { 
NSDictionary *myDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Station", @"27200", @"Latitude", @"41.656467", @"Longitude", @"-81.277963", nil]; 
[myArray addObject:myDictionary]; 
} 

3) Vous pouvez charger votre fichier MutableArray comme celui-ci :

NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                    NSUserDomainMask, 
                    YES); 
NSMutableString *documentDirectory = [documentDirectories objectAtIndex:0]; 
NSString *myPath = [documentDirectory stringByAppendingPathComponent:@"UserData"]; 
NSMutableArray *myArray = [[NSMutableArray alloc] initWithContentsOfFile:myPath]; 

Vous pouvez enregistrer votre fichier MutableArray comme ceci:

NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSMutableString *documentDirectory = [documentDirectories objectAtIndex:0]; 
NSString *filePath = [documentDirectory stringByAppendingPathComponent:@"UserData"]; 
BOOL fileError = [myArray writeToFile:filePath atomically:YES]; 
+0

Merci pour la réponse. Avez-vous un commentaire sur l'autre réponse fournie par rapport à la vôtre? Je vais regarder dans les deux réponses et vous laisser savoir comment ça se passe. – JBeesky

+0

Essayez les deux et voyez ce qui fonctionne pour vous. Quant à la réponse de Rob, son compte de réputation est de 22.7K donc il court des cercles autour de moi :) – sangony

Questions connexes