2014-10-19 55 views
0

因此,我正在Objective-C中製作一個簡單的應用程序,使用單個tableview來顯示機場及其相關的機場代碼,並允許用戶添加新的機場。NSMutableArray保持乘法/重置

我已經在NSArray中創建了一類已知機場及其代碼,用於設置已知機場的初始tableview數據。在viewDidLoad中,我設置了本地的NSMutableArray等於已知機場陣列

- (void)viewDidLoad { 
    [super viewDidLoad]; 

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

} 

在一個單獨的視圖控制器,機場和它的數據可以被添加到這個陣列通過委託方法,但正如你可能已經猜到了,每次應用程序啓動,在viewDidLoad中添加此代碼不僅會將我的NSMutableArray * allAirport重置爲僅* knownAirports數組,但是一旦我實現NSUserDefaults以保留所添加的機場,它會將原始self.allAirports數組中的機場數量加倍。 ..所以我添加的第三個機場,它增加了三倍,等等......

所以我的問題是,我怎樣才能將knownAirports數據帶入這個應用程序,而不乘以每次?除了viewDidLoad,我還可以在哪裏聲明和設置這些值,它只會評估一次,絕不再回顧已知機場數組?我已經在這個bug三天了,並嘗試了所有我能想到的解決方法。在此先感謝

回答

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"]; 

請記住,以後當你檢索用戶默認的陣列上這將是,即使你救了一個可變的一個不可改變的陣列。

+0

哇!你讓我的一整天都是我的朋友。我從來沒有想過只是使用if/else來檢查NSUserDefaults鍵的值....非常感謝你的建議。 順便說...由於某種原因,我不得不 檢查用戶默認值,如果([airportArray計數] == 0){ // 雅達內容十分重要 } 因爲當我檢查,如果由於某種原因語句'nil'它總是返回零,即使在評估else語句之後。無論哪種方式,這既不在這裏,也不在那裏,因爲我的應用程序工作,我感謝你一百萬! – 2014-10-21 04:27:55