2013-06-13 2 views
0

У меня есть кусок кода, который возвращает объект типа Card как так:Метод не возвращает то, что он должен, когда называется

-(Card*) drawRandomCard { 
    if ([self.cards count]) { 
     unsigned index = arc4random() % self.cards.count; 
     Card *randomCard = self.cards[index]; 
     [self.cards removeObjectAtIndex:index]; 
     NSLog(@"%@", randomCard.description); **//returns a description and not null** 
     return randomCard; 
    } else { 
     NSLog(@"nil"); 
     return nil; 
    } 
} 

Это на самом деле работает хорошо, когда я использую его в других функциях, но есть проблема с этим ниже:

- (IBAction)addCards:(UIButton *)sender { 
    int numberOfCardsToAdd = EXTRA_CARDS_NUMBER; 

    if ([[self.collectionView visibleCells] count] == 0) { 
     numberOfCardsToAdd = self.startingCardCount; 
    } 

    for (int i = 0; i < numberOfCardsToAdd; i++) { 
     if (!self.game.deck.isEmpty){ 
      Card *cardToAdd = [self.game.deck drawRandomCard]; 
      NSLog(@"%@", cardToAdd.description); **// gives (null)** 
       if (cardToAdd) { **// this does not get called** 
        // do stuff with cardToAdd 
       } 
      } 
     } 
     [self.collectionView reloadData]; 
} 

Так почему-то кажется, что я drawRandomCard, когда вызывается с описанным выше способом, не работает. Кто-нибудь знает, как это исправить?

Большое спасибо!

Edit: мой метод для инициализации игрового объекта, который имеет свойство deck:

- (id) initWithNumberOfCards: (int) numberOfCards withDeck: (SetsPlayingDeck *) deck { 
    self = [self init]; 
    self.score = 0; 
    _deck = deck; 
    _cards = [[NSMutableArray alloc] initWithCapacity:numberOfCards]; 
    for (int i = 0; i < numberOfCards; i++) { 
     [_cards addObject: [_deck drawRandomCard]]; 
    } 
    return self; 

} 

Этот метод вызывается в самом начале программы.

Edit # 2:

Вот код, который инициализирует объект игры, наряду с объектом палубного который является его собственностью:

- (SetsGame *) game { 
    if (!_game) { 
     SetsPlayingDeck *deck = [[SetsPlayingDeck alloc] init]; 
     _game = [[SetsGame alloc] initWithCardCount:self.startingCardCount usingDeck:deck]; 
    } 

    NSLog(@"%@", _game.deck.description); **// this returns null!!** 
    return _game; 
} 
+1

Вы проверили, что 'self.game' и' self.game.deck' оба не 'nil'? Вы установили точку останова в отладчике и однократно вошли в этот метод, чтобы найти проблему? –

+0

Я уже пробовал отладчик, но я просто проверил, как вы сказали, и 'self.game' не' nil', а 'self.game.deck'. Я не понимаю, почему, поскольку 'deck' является сильным' @ свойством' 'self.game', и я его настроил, когда я инициализировал объект' game'. – merah

+0

Вы правильно инициализируете свойство «колода»? Вы уверены, что он уже инициализирован к тому времени, когда вы попытаетесь получить к нему доступ? Боюсь, не увидев больше кода, будет очень сложно определить проблему. – LuisCien

ответ

1

Насколько я понимаю, этот вопрос должен лежать методом initWithCardCount:usingDeck:, где вы, вероятно, забыли назначить deck аргумент deck собственности (или по какой-либо причине назначение не выполняется):

_game = [[SetsGame alloc] initWithCardCount:self.startingCardCount usingDeck:deck]; 

Итак, просмотрите это или опубликуйте это определение метода.

+0

Спасибо за это! Я проверил и выяснил, что мои методы в моей модели и мой контроллер не совпадают: '- (id) initWithNumberOfCards: (int) numberOfCards withDeck: (SetsPlayingDeck *) deck' в игровой модели должно быть' - (id) initWithCardCount: (int) numberOfCards withDeck: (SetsPlayingDeck *) колода' вместо этого! – merah

-1

Может быть, проблема в том, что вы работаете из карты. Внутри ваш метод инициализации вы имеете следующую строку внутри для цикла:

[_cards addObject: [_deck drawRandomCard]]; 

И внутри метода drawRandomCard вы имеете следующую строку:

[self.cards removeObjectAtIndex:index]; 

Я предполагаю, что _cards (первая линия) и self.cards (2-я строка) - разные объекты.

Возможно, что бы когда вы звоните Card *cardToAdd = [self.game.deck drawRandomCard]; внутри своего метода addCards: у вас еще нет карт.

Попробуйте установить точку останов и шаг в течение петли и дайте мне знать,

Надеется, что это помогает!

+0

К сожалению, это не проблема. Я установил точку останова и «NSLog», но карты, которые 'drawRandomCard' должны были нарисовать, не были там, где почти закончилось. – merah

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