我正在跟随斯坦福大学的ios 7课程(在第三讲),教师建立一个卡片匹配游戏。屏幕上有12张卡片,它们连接到ViewController
中的此属性@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons;
当点击任何按钮时,会触发此方法
- (IBAction)touchCardButton:(UIButton *)sender {
NSLog(@"touchCardbutton");
int cardIndex = [self.cardButtons indexOfObject:sender];
[self.game chooseCardAtIndex:cardIndex];
[self updateUI];
}
在viewController中触发updateUI
- (void)updateUI{
NSLog(@"updateUI");
for (UIButton *cardButton in self.cardButtons){
int index = [self.cardButtons indexOfObject:cardButton];
NSLog(@"index in UpdateUI %d", index);
Card *card = [self.game cardAtIndex:index];
NSLog(@"card in UpdateUI %@", card);
[cardButton setTitle:[self titleForCard:card ]forState:UIControlStateNormal];
[cardButton setBackgroundImage:[self backgroundImageForCard:card] forState:UIControlStateNormal];
cardButton.enabled = !card.isMatched;
}
}
在此updateUi方法中,第二个NSLog语句显示card
为零。第一个NSLog语句显示index
没有问题。那么为什么card
为零呢?我假设在视图控制器中此属性引用的cardMatchGame类中的cardAtIndex方法存在一些问题
@property(强大,非原子)CardMatchingGame *游戏;
cardAtIndex
-(Card *)cardAtIndex:(NSInteger)index
{
NSLog(@"cardAtIndex %d", index);
return (index < [self.cards count]) ? self.cards[index] : nil;
}
此NSLog语句未在控制台中显示,因此当我在updateUI
Card *card = [self.game cardAtIndex:index];
你能解释为什么在我构建和运行时没有错误消息的情况下可能没有调用cardAtIndex方法吗?
更新
在视图控制器中,游戏属性像这样懒惰地实例化
-(CardMatchingGame *)game
{
if (_game) _game = [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:self.createDeck];
return _game;
}
答案 0 :(得分:3)
您self.game
引用为nil
,因此不会进行任何通话。由于调用nil
被定义为什么都不做,因此不会引发警告/错误。
您的问题似乎源于您的访问者方法中的逻辑问题,该问题应该是:
- (CardMatchingGame *)game
{
if (!_game)
_game = [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:self.createDeck];
return _game;
}
请注意添加!
通常最好不要快捷方式并使用if (!something)
,但要明确并使用if (something == nil)
,因为更清楚,更快速地了解正在发生的事情。