2014-10-19 3 views
0

Так что я делаю простую программу в Objective-C с одним табличным представлением, которое отображает аэропорты и связанные с ними коды аэропортов, а также позволяет пользователю добавлять новые аэропорты.NSMutableArray продолжает умножать/перезагружать

Я создал класс известных аэропортов и их коды в NSArray, чтобы установить начальные данные таблицы с известными аэропортами. В viewDidLoad я установил местный NSMutableArray равного известных аэропортов массив

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.allAirports = [[GGAirportData knownAirports] mutableCopy]; 

} 

В отдельном ViewController, аэропорту и его данные могут быть добавлен в массив с помощью методов делегата, но, как вы можете догадаться, каждый раз, приложение загружается, имея этот код в viewDidLoad не только сбрасывает мой NSMutableArray * allAirports только в массив * knownAirports, но как только я реализую NSUserDefaults для сохранения добавленных аэропортов, он удваивает количество аэропортов в исходном массиве self.allAirports .. ..также третий аэропорт я добавляю, он троекрит его и т. д.

Итак, мой вопрос в том, как я могу принести известные данные в это приложение без его умножения каждый раз? Где еще я могу объявить и установить эти значения, отличные от viewDidLoad, где он будет оценивать только один раз и никогда больше не оглядываться на массив известных массивов? Я был на этой ошибке уже 3 дня и пробовал все обходные пути, о которых я могу думать. Заранее спасибо

ответ

0

В вашем режиме просмотраDidLoad вы можете проверить, существует ли массив аэропортов в 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"]; 

Имейте в виду, что в дальнейшем, когда вы извлекаете массив из пользователей по умолчанию он будет непреложным массив, даже если вы сохранили изменяемый один.

+0

WOW !! Ты просто весь день провел моим другом. Я никогда не думал просто использовать if/else, чтобы проверить значение ключа NSUserDefaults ... большое спасибо за предложение. Кстати ... по какой-то причине я должен был проверить по умолчанию пользователя по если ([числу airportArray] == 0) { // Яд болтовня } По какой-то причине, когда я проверил, если оператор с 'nil' он всегда возвращал nil даже после вычисления выражения else. В любом случае, это ни здесь, ни там, потому что мое приложение работает, и я благодарю вас за миллион! –

Смежные вопросы