所以我在Objective-C中创建了一个简单的应用程序,其中包含一个显示机场及其相关机场代码的tableview,以及允许用户添加新机场。
我在NSArray中创建了一类已知机场及其代码,用于设置已知机场的初始tableview数据。在viewDidLoad中,我将本地NSMutableArray设置为等于已知的机场数组
- (void)viewDidLoad {
[super viewDidLoad];
self.allAirports = [[GGAirportData knownAirports] mutableCopy];
}
在一个单独的ViewController中,可以通过委托方法将机场及其数据添加到此数组中,但正如您可能猜到的,每次应用程序启动时,在viewDidLoad中使用此代码不仅会将我的NSMutableArray * allAirports重置为只有* knownAirports阵列,但是一旦我实施NSUserDefaults来保留增加的机场,它就会使原来的self.allAirports阵列中的机场数量增加一倍....所以我添加的第三个机场,它三倍等等......
所以我的问题是,如何将已知的机场数据带入此应用程序而不会每次都成倍增加?除了viewDidLoad之外我还可以在哪里声明和设置这些值,它只会评估一次并且永远不再回顾knownAirports数组?我已经在这个bug上做了3天了,并尝试了我能想到的每一种解决方法。提前致谢
答案 0 :(得分:0)
在viewDidLoad中,您可以检查NSUserDefaults中是否已存在机场阵列。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *airportArray = [userDefaults arrayForKey:@"allAirports"];
if(airportArray == nil) {
// airports array doesn't exist, create new one from default
self.allAirports = [[GGAirportData knownAirports] mutableCopy];
// save
[userDefaults setObject:self.allAirports forKey:@"allAirports"];
}
else {
//airports array already exists, use it instead of default
self.allAirports = [airportArray mutableCopy];
}
现在,您可以随意编辑self.allAirports
。
// assume GGAirport class exists and add a new instance to allAirports array
GGAirport *newAirport = [[GGAirport alloc] initWithName:@"San Francisco International" code:@"SFO"];
[self.allAirports addObject:newAirport];
// save to user defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.allAirports forKey:@"allAirports"];
请记住,稍后当您从用户默认值中检索数组时,即使您保存了一个可变数组,它也将是一个不可变数组。