2013-03-15 86 views
0

在我的ViewController中,我添加了一個UISegmentedControl來爲不同的任務預製不同的任務,用於不同的分段控件選擇。它是一款卡片匹配遊戲。如何讓我的分段UISegmentedControl做出響應?

一切似乎工作得很好,除了分段控制沒有對選擇作出反應..,我創建了一個開關做「雙卡遊戲」的情況下,並在「三卡遊戲」的情況下。

從我的理解這將是很好的定義與枚舉,這是我在控制器的頂部做了這些變量,但它似乎像我缺少一些東西..

很抱歉,如果它不是那麼直接,但我的控制器非常簡短,如果你能告訴我在UISegmentedControl方面我做了什麼錯誤,將不勝感激。

這就是:

#import "CardGameViewController.h" 
#import "PlayingCardsDeck.h" 
#import "CardMatchingGame.h" 

enum CardGame { 
    twoCardGame, 
    threeCardGame 
}; 

@interface CardGameViewController() 


@property (weak, nonatomic) IBOutlet UILabel *notificationLabel; 
@property (weak, nonatomic) IBOutlet UILabel *scoreCounter; 
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *cardButtons; 
@property (strong, nonatomic) CardMatchingGame *game; 
@property (weak, nonatomic) IBOutlet UISegmentedControl *numberOfCardsToPlayWith; 

@end 


@implementation CardGameViewController 


//creating the getter method that creates a new card game. 
- (CardMatchingGame *)game { 
    if (!_game) { 
     _game = [[CardMatchingGame alloc] initWithCardCount:self.cardButtons.count 
                usingDeck:[[PlayingCardsDeck alloc] init]]; 
     _game.numberOfCardsToPlayWith = [self selectNumberOfCardsToPlayWith]; 
    } 
    return _game; 
} 


//creating a setter for the IBOutletCollection cardButtons 
-(void)setCardButtons:(NSArray *)cardButtons { 
    _cardButtons = cardButtons; 
    [self updateUI]; 
} 



- (void)updateUI { 

    for (UIButton *cardButton in self.cardButtons) { 
     Card *card = [self.game cardAtIndex:[self.cardButtons indexOfObject:cardButton]]; 
     [cardButton setTitle:card.contents forState:UIControlStateSelected]; 
     [cardButton setTitle:card.contents 
        forState:UIControlStateSelected|UIControlStateDisabled]; 
     cardButton.selected = card.isFaceUp; 
     cardButton.enabled = !card.isUnplayable; 
     cardButton.alpha = card.isUnplayable ? 0.3 : 1.0; 

    } 
    self.scoreCounter.text = [NSString stringWithFormat:@"Score: %d", self.game.score]; 
} 


//Here I created a method to flipCards when the card is selected, and give the user a random card from the deck each time he flips the card. After each flip i'm incrementing the flipCount setter by one. 
- (IBAction)flipCard:(UIButton *)sender { 

    [self.game flipCardAtIndex:[self.cardButtons indexOfObject:sender]];; 
    [self updateUI]; 
} 


//sending an alert if the user clicked on new game button 
- (IBAction)newGame:(UIButton *)sender { 

    UIAlertView* mes=[[UIAlertView alloc] initWithTitle:@"Think about it for a sec..?" message:@"This will start a new game" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; 

    [mes show]; 
} 


- (NSUInteger)selectNumberOfCardsToPlayWith { 
    switch (self.numberOfCardsToPlayWith.selectedSegmentIndex) { 
     case twoCardGame: 
      return 2; 
     case threeCardGame: 
      return 3; 
     default: 
      return 2; 
    } 

    [self updateUI]; 
} 

//preforming an action according to the user choice for the alert yes/no to start a new game 
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 

    if (buttonIndex != [alertView cancelButtonIndex]) { 

     self.game = nil; 
     for (UIButton *button in self.cardButtons) { 
      Card *card = [self.game cardAtIndex:[self.cardButtons indexOfObject:button]]; 
      card.isUnplayable = NO; 
      card.isFaceUp = NO; 
      button.alpha = 1; 
     } 

     self.notificationLabel.text = nil; 
     [self updateUI]; 

    } 
} 


@end 

回答

1

嘛,我看不出有任何addTarget:調用分段控制。所以你可能在Interface Builder中設置它們。檢查IB連接。如果IB中的所有內容看起來都不錯 - 試着以編程方式嘗試addTarget:

+0

我有selectNumberOfCardsToPlayWith方法,它使用插座'IBOutlet UISegmentedControl * numberOfCardsToPlayWith;'但我覺得是錯誤的是關於枚舉的東西...像它看起來不像選擇段知道我點擊了哪個按鈕@folex – MNY 2013-03-15 17:44:17

+0

感謝好友@folex – MNY 2013-03-15 17:57:26

1

我想你最好是去創建一個選擇並將其添加到分段控制目標,像這樣:

[segmentedControl addTarget:self 
         action:@selector(selectNumberOfCardsToPlayWith:) 
       forControlEvents:UIControlEventValueChanged]; 

- (NSUInteger)selectNumberOfCardsToPlayWith:(UISegmentedControl *)control { 
     switch (control.selectedSegmentIndex) { 
      case twoCardGame: 
       return 2; 
      case threeCardGame: 
       return 3; 
      default: 
       return 2; 
     } 

     [self updateUI]; 
} 

這應該很好地工作。目前使用類似的代碼。

+0

或者如folex所說,檢查您的IB連接是否指向正確的方法。 – Tim 2013-03-15 17:43:57

+0

但是這條線在哪裏? [segmentedControl addTarget:self action:@selector(selectNumberOfCardsToPlayWith :) forControlEvents:UIControlEventValueChanged]; @tim – MNY 2013-03-15 17:46:16

+0

謝謝你的朋友@Tim – MNY 2013-03-15 17:57:45