从不同的视图控制器调用方法

时间:2013-12-05 04:24:29

标签: ios iphone methods viewcontroller

我最近一直在探索虚拟卡牌随机化和抽奖卡作为一个小小的爱好,并且一直专注于在Ontswedder找到的精彩教程。但是,我遇到了一个小问题,我希望你可以帮助我!

下面,我列出了一些关键代码,供您查看。

在我的 viewController 中,我想要同时调用 Deck.m 中的shuffledraw方法。如果我执行以下操作,则可以这样做:

Deck *d = [[Deck alloc] init];

[d shuffle];
[d deal];

但是,我需要能够拆分它们。例如,单击一个按钮会初始化卡座并将其随机播放,而另一个新按钮会绘制一张新卡(直到卡座为空)。

我遇到了这个问题,我可以执行以下操作:

Deck *d = [[Deck alloc] init];

[d shuffle];


Deck *d = [[Deck alloc] init];

[d deal];

但这对我来说毫无用处,好像我打电话给init然后创建一个新的UNSHUFFLED牌组,并从这个新牌组中发牌。

我已尝试在 viewController.h 中声明Deck *DeckObject,然后只是调用[DeckObject draw];,但这会提供空值。

最后,我想分别称这两种方法。如果可能的话,每次都不需要init新牌组!! : - )

我非常感谢大家对这篇文章的帮助,也非常感谢网站!

我希望这也是有道理的。如果您想了解更多信息,请与我们联系。 另外,如果我的任何术语不正确,我会道歉 - 仍然是一个新手!


包含上下文代码:

Card.h

typedef enum {
    Hearts,
    Diamonds,
    Spades,
    Clubs
} Suit;

#define Ace   1
#define Jack  11
#define Queen 12
#define King  13

@interface Card : NSObject {

NSInteger value;
Suit suit;
}

@property (nonatomic) NSInteger value;
@property (nonatomic) Suit suit;

- (id) initWithValue:(NSInteger) aValue suit:(Suit) aSuit;

@end

Card.m

@interface Card(Private)

- (NSString *) valueAsString;
- (NSString *) suitAsString;

@end


@implementation Card

@synthesize value,suit;

- (id) initWithValue:(NSInteger) aValue suit:(Suit) aSuit {
if(self = [super init]) {
    self.value = aValue;
    self.suit = aSuit;
}
return self;
}

- (NSString *) valueAsString {
switch (self.value) {
    case Ace:
        return @"Ace";
        break;
    case Jack:
        return @"Jack";
        break;
    case Queen:
        return @"Queen";
        break;
    case King:
        return @"King";
        break;
    default:
        return [NSString stringWithFormat:@"%d",self.value];
        break;
}
}

- (NSString *) suitAsString {
switch (self.suit) {
    case Hearts:
        return @"Hearts";
        break;
    case Diamonds:
        return @"Diamonds";
        break;
    case Spades:
        return @"Spades";
        break;
    case Clubs:
        return @"Clubs";
        break;
    default:
        return nil;
        break;
}
}

- (NSString *) description {
return [NSString stringWithFormat:@"%@ %@",
        [self valueAsString],
        [self suitAsString]];
}

@end

加入deck.h

@interface Deck : NSObject {

@private
NSMutableArray *cards;
}

- (void) shuffle;
- (Card *) draw;
- (NSInteger) cardsRemaining;

@end

Deck.m

@implementation Deck

- (id) init {
if(self = [super init]) {
    cards = [[NSMutableArray alloc] init];
    for(int suit = 0; suit <= 3; suit++) {
        for(int value = 1; value <= 13; value++) {
            Card *card = [[Card alloc] initWithValue:value suit:suit];
            [cards addObject:card];
            [card release];
        }
    }
}
return self;
}


int randomSort(id obj1, id obj2, void *context ) {
// returns random number -1 0 1
return (arc4random()%3 - 1);    
}

- (void) shuffle {
for(int x = 0; x < 500; x++) {
    [cards sortUsingFunction:randomSort context:nil];
}
}

- (Card *) draw {

if([self cardsRemaining] > 0) {
    Card *card = [[cards lastObject] retain];
    [cards removeLastObject];
    return [card autorelease];
}

NSException* myException = [NSException 
exceptionWithName:@"OutOfCardsException"
reason:@"Tried to draw a card from a deck with 0 cards." userInfo:nil]; @throw
myException;
}

- (NSInteger) cardsRemaining {
return [cards count];
}

- (NSString *) description {
NSString *desc = [NSString stringWithFormat:@"Deck with %d cards\n",[self
cardsRemaining]];
for(int x = 0; x < [self cardsRemaining]; x++) {
    desc = [desc stringByAppendingFormat:@"%@\n",[[cards objectAtIndex:x]       description]];
}
return desc;
}

- (void) dealloc {
[cards release];
[super dealloc];
}

@end

2 个答案:

答案 0 :(得分:1)

当你声明属性deckObject时,它只是创建指针,你仍然需要为init创建一个实例来分配一个Deck对象。

self.deckObject = [[Deck alloc] init];

然后,您可以在不同的按钮方法中使用[self.deckObject shuffle][self.deckObject deal]

答案 1 :(得分:1)

您必须在 viewController.h 中声明Deck *DeckObject,如下所示

@interface firstViewController : UIViewController {
    Deck *DeckObject;
}

现在在 viewController.m 文件的 viewDidLoad 方法中将其初始化为如下所示

Deck *DeckObject = [[Deck alloc] init];

之后你可以在uibutton的动作方法中调用方法

- (IBAction)BtnShuffle:(id)sender
{
    if (DeckObject) {
        [DeckObject shuffle];
    }
}

- (IBAction)BtnDraw:(id)sender
{
    if (DeckObject) {
        [DeckObject draw];
    }
}