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

そのため、何らかの理由で mydrawRandomCardが上記のメソッドで呼び出されたときに機能しないようです。これを修正する方法を知っている人はいますか?

どうもありがとう!

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;

}

このメソッドは、プログラムの開始時に呼び出されます。

編集#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;
}
4

2 に答える 2

1

私が見る限り、問題はメソッドにあるはずです。おそらく、引数をプロパティinitWithCardCount:usingDeck:に割り当てるのを忘れていました(または何らかの理由で割り当てが実行されていません):deckdeck

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

したがって、これを確認するか、そのメソッド定義を投稿してください。

于 2013-06-16T07:54:44.837 に答える
-1

多分問題は、カードが不足していることです。init メソッド内には、for ループ内に次の行があります。

[_cards addObject: [_deck drawRandomCard]];

メソッド内にdrawRandomCardは次の行があります。

[self.cards removeObjectAtIndex:index];

_cards(1 行目) とself.cards(2 行目) は別のオブジェクトだと思います。

おそらく、メソッドCard *cardToAdd = [self.game.deck drawRandomCard];内で呼び出すまでにaddCards:、カードが残っていないでしょう。

ブレークポイントを設定して for ループにステップインして、私に知らせてください。

お役に立てれば!

于 2013-06-13T20:56:04.833 に答える