0

我已经制作了一个应用程序,可以将用户的位置与具有格式的位置数组进行比较......

NSArray *myStationArray;

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

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

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

2.) 我的 IBAction 代码将如何保存当前位置和 kStation 输入以创建一个数组以匹配上面的示例?

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

提前感谢您的时间。

4

2 回答 2

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,但如果此列表可能相当短(即您不介意将整个内容加载到内存中同时),上述使用 plist 的技术arrayWithContentsOfFile可能writeToFile就足够了。

于 2013-04-28T21:25:35.293 回答
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];
于 2013-04-28T21:51:04.047 回答