动态创建位置坐标数组

时间:2013-04-28 20:38:35

标签: ios nsmutablearray nsdictionary ibaction cllocation

我已经创建了一个应用程序,将用户的位置与格式化的位置数组进行比较......

NSArray *myStationArray;

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

现在我希望用户能够动态创建这个数组,他们可以选择一个IBAction按钮,将其当前位置(lat long)添加到显示格式的可变数组中。 kStation值将由用户输入。我知道概念性问题是不受欢迎的,所以我会根据这个想法提出这些具体问题。

1。)我应该在哪里创建可变数组(viewDidLoad,IBAction,didUpdateToLocation等)?它需要保存到应用程序,以便用户可以在其整个生命周期中添加和删除它。

2.。)我的IBAction代码将保存当前位置和kStation输入以创建与上述示例匹配的数组?

3。)这是否是您想要使用sqlite等数据库的地方?如果可能的话,我宁愿避免使用数据库,但是想知道这样做的最佳方法。

感谢您提前的时间。

2 个答案:

答案 0 :(得分:0)

您可能会为列表定义此NSMutableArray作为类属性:

@property (nonatomic, strong) NSMutableArray *stations;

当您使用它时,您可以为您的文件名定义NSString属性:

@property (nonatomic, strong) NSString *filename;

您可以在viewDidLoad中加载以前的值或将其初始化,其中kFilename设置为@"stations.plist"或类似的内容:

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];

您可以在IBAction中添加新值(如果您希望在用户点击按钮时添加它们),或者在didUpdateToLocation中添加新值(如果您希望将其作为用户自动添加)移动)。例如,如果您在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];
}

如果您的电台列表可能变大,那么您可能需要考虑使用Core Data或SQLite,但如果此列表可能相当短(即您不介意将整个内容加载到同时记忆),上述通过arrayWithContentsOfFilewriteToFile使用plist的技术可能就足够了。

答案 1 :(得分:0)

按顺序回答您的问题:

1)你可能想在viewDidLoad中创建和初始化你的NSMutableArray。

2)您可以创建自己的类,类似MKAnnotation格式的类或创建字典,然后将其粘贴到数组中,如下所示:

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

3)您可以像这样加载MutableArray文件:

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

您可以像这样保存MutableArray文件:

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