Objective c 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

因此,我在Objective-C中制作了一个简单的应用程序,其中有一个tableview,可以显示机场及其相关的机场代码,并允许用户添加新机场

我在NSArray中创建了一类已知机场及其代码,用于设置已知机场的初始tableview数据。在viewDidLoad中,我将本地NSMutableArray设置为与已知阵列相等

- (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。不管怎样,这都不存在,因为我的应用程序工作正常,我非常感谢你!