2013-10-04 113 views
0

我曾經在這裏呼籲getBoardingCards:爲什麼我的數組返回null?

BRPBoardingCards *boardingCards = [[BRPBoardingCards alloc] init]; 
boardingCardsArray = [boardingCards getBoardingCards]; 

陣列被返回null雖然(在NSLog的顯示)。我究竟做錯了什麼?

- (NSArray*)getBoardingCards 
{ 
    NSMutableArray *storedArray = [[NSMutableArray alloc] init]; 
    Utils *utils = [[Utils alloc] init]; 
    NSUserDefaults *properties = [utils getUserDefaults]; 



    // check if its the first time we are running the app. 
    if(![[properties objectForKey:@"first_run"] isEqualToString:@"no"]){ 
     //I decided it is for american tourists and every booking office allows payment in dollars because I dont have a euros key on my keyboard. 
     //Car also has lots of seats. 1337 of them to be precise. 
     [self setNewBoardingCardWithCardType:@"car" WithPrice:@"$1.50" AndStartLocation:@"airport" AndEndLocation:@"restaurant" WithSeat:@"1337" andExtraInformation:@"We dont like you so we are giving you the back seat by yourself."]; 
     [self setNewBoardingCardWithCardType:@"helicopter" WithPrice:@"$500" AndStartLocation:@"restaurant" AndEndLocation:@"hospital" WithSeat:@"1" andExtraInformation:@"You are driving."]; 
     [self setNewBoardingCardWithCardType:@"train" WithPrice:@"$100" AndStartLocation:@"restaurant" AndEndLocation:@"ditch" WithSeat:@"STANDONHEAD" andExtraInformation:@"No Seats on this train. Gotta stand on your head. Dont forget your white lightning for the ditch."]; 
     [self setNewBoardingCardWithCardType:@"Fire Engine" WithPrice:@"$10" AndStartLocation:@"restaurant" AndEndLocation:@"burning house" WithSeat:@"HOSE" andExtraInformation:@"Take the hose to put out this fire we are heading to. "]; 
     [self setNewBoardingCardWithCardType:@"Nimbus" WithPrice:@"$300" AndStartLocation:@"burning house" AndEndLocation:@"popo floating island" WithSeat:@"LEVITATION" andExtraInformation:@"Dont forget to turn super saiyan on your way up there. "]; 
     [self setNewBoardingCardWithCardType:@"Sky Dive" WithPrice:@"$1020" AndStartLocation:@"popo floating island" AndEndLocation:@"home" WithSeat:@"GRAVITY" andExtraInformation:@"Ohh! that Adrenalines pumping. "]; 

     [self setNewBoardingCardWithCardType:@"Legs" WithPrice:@"$50" AndStartLocation:@"ditch" AndEndLocation:@"park bench hotel" WithSeat:@"VODKA" andExtraInformation:@"Time to get a good nights rest and sobre up. "]; 
     [self setNewBoardingCardWithCardType:@"Bicycle" WithPrice:@"$5" AndStartLocation:@"park bench hotel" AndEndLocation:@"home" WithSeat:@"BIKESEAT1" andExtraInformation:@"What a terrible hangover. Time to head home. "]; 

     [self setNewBoardingCardWithCardType:@"ambulance" WithPrice:@"$40" AndStartLocation:@"hospital" AndEndLocation:@"home" WithSeat:@"LEVITATION" andExtraInformation:@"Well that was a bad idea! "]; 

     [properties setObject:@"no" forKey:@"first_run"]; 
     [properties synchronize]; 

     NSLog(@"did set first run to no"); 
    } 

     storedArray = [[properties objectForKey:@"cards"] mutableCopy]; 


     NSLog(@"getBoardingCards storedArray: %@", storedArray); 

    return storedArray; 
} 

- (NSArray*)getBoardingCardsByType:(NSString*)cardType 
{ 
    // at this point i would create a for loop and iterate through the array checking if (type isEqualToString:cardType). 
    // But this is just an idea for later. To go by only a certain type of route. 
    return nil; 
} 



- (void)setNewBoardingCardWithCardType:(NSString*)cardType WithPrice:(NSString*)price AndStartLocation:(NSString*)startLocation AndEndLocation:(NSString*)endLocation WithSeat:(NSString*)seatCode andExtraInformation:(NSString*)extraInfo{ 

    // populate the dictionary with data. 
    NSMutableDictionary *card = [[NSMutableDictionary alloc] init]; 
    [card setObject:cardType forKey:@"type"]; 
    [card setObject:price forKey:@"price"]; 
    [card setObject:startLocation forKey:@"startLocation"]; 
    [card setObject:endLocation forKey:@"endLocation"]; 
    [card setObject:seatCode forKey:@"seat"]; 
    [card setObject:extraInfo forKey:@"info"]; 

    // get our stored array. 
    Utils *utils = [[Utils alloc] init]; 
    NSUserDefaults *properties = [utils getUserDefaults]; 
    NSMutableArray *storedArray = [[properties objectForKey:@"cards"] mutableCopy]; 

    [storedArray addObject:card]; 
    // set the stored array. 
    [properties setObject:storedArray forKey:@"cards"]; 
    [properties synchronize]; 

} 
+1

如果你無條件地在'storedArray = [[properties objectForKey:@「cards」] mutableCopy]中覆蓋它,那麼設置'storedArray = [[NSMutableArray alloc] init]'有什麼意義? – dasblinkenlight

+0

數組不能包含零個條目。當數組「返回null」時,幾乎可以確定該數組不存在。 –

+0

哪裏設置鑰匙'卡'的值? – manujmv

回答

4

你沒有創建於NSUserDefaultscards可變數組。 這行(setNewBoardingCardWithCardType:):

NSMutableArray *storedArray = [[properties objectForKey:@"cards"] mutableCopy]; 

基本上是

NSMutableArray *storedArray = [nil mutableCopy]; 

這是一樣的

NSMutableArray *storedArray = nil; 

檢查是否存在此鍵的對象,如果沒有 - 創建然後使用它。

+0

這是它的感謝!我不知道如何錯過我多麼愚蠢! – jimbob

+1

隨時都會發生。 – Alexander