Objective c NSMutableArray一直在乘法/重置
因此,我在Objective-C中制作了一个简单的应用程序,其中有一个tableview,可以显示机场及其相关的机场代码,并允许用户添加新机场 我在NSArray中创建了一类已知机场及其代码,用于设置已知机场的初始tableview数据。在viewDidLoad中,我将本地NSMutableArray设置为与已知阵列相等Objective c NSMutableArray一直在乘法/重置,objective-c,uitableview,viewdidload,Objective C,Uitableview,Viewdidload,因此,我在Objective-C中制作了一个简单的应用程序,其中有一个tableview,可以显示机场及其相关的机场代码,并允许用户添加新机场 我在NSArray中创建了一类已知机场及其代码,用于设置已知机场的初始tableview数据。在viewDidLoad中,我将本地NSMutableArray设置为与已知阵列相等 - (void)viewDidLoad { [super viewDidLoad]; self.allAirports = [[GGAirportData k
- (void)viewDidLoad {
[super viewDidLoad];
self.allAirports = [[GGAirportData knownAirports] mutableCopy];
}
在单独的ViewController中,可以通过委托方法将机场及其数据添加到此阵列中,但正如您可能猜到的,每次应用程序启动时,在viewDidLoad中包含此代码不仅会将我的NSMutableArray*allAirports重设为仅*knownAirports阵列,而且一旦我实现NSUserDefaults以保留添加的机场,它将原来self.allAirports数组中的机场数量增加了一倍……因此我添加的第三个机场将其增加了三倍,以此类推
因此,我的问题是,如何将knownAirports数据引入此应用程序,而不使其每次都成倍增加?除了viewDidLoad之外,我还可以在哪里声明和设置这些值?在viewDidLoad中,它只计算一次,并且永远不会再次查看knownAirports数组?我已经在这个错误上呆了3天了,并且已经尝试了我能想到的所有解决方法。提前感谢在您的视图中,您可以检查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"];
请记住,以后从用户默认值检索数组时,它将是一个不可变数组,即使您保存了一个可变数组。WOW!!你把我一整天都当成朋友了。我从未想过只使用if/else来检查NSUserDefaults键的值……非常感谢您的建议。顺便说一句……出于某种原因,我不得不通过if([airportArray count]==0){//Yada-Yada-Yada}检查用户默认值。出于某种原因,当我用“nil”检查if语句时,即使在计算else语句之后,它也总是返回nil。不管怎样,这都不存在,因为我的应用程序工作正常,我非常感谢你!