【问题标题】:Calling a method from a different view controller从不同的视图控制器调用方法
【发布时间】:2013-12-05 04:24:29
【问题描述】:

我最近一直在探索虚拟卡片组随机化和卡片绘制作为一个小爱好,并且一直专注于在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 然后创建一个新的、未洗牌的牌组,并从这个新牌组中发牌。

我尝试在 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

【问题讨论】:

  • 也许我遗漏了一些东西,但看起来你只是想要一个在 VC 初始化时初始化的视图控制器中的 Deck 属性,然后你调用 shuffle 并随意绘制。还有其他的吗?
  • 如果你使用过这个 vc 然后从 self.navigationcontroller.viewcontrollers 获取那个实例或者创建新实例并访问那个方法

标签: ios iphone methods viewcontroller


【解决方案1】:

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

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

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

【讨论】:

  • 完美!看起来这就是我所缺少的:-)
  • 但是,当我使用这种方法时,[self.deckObject deal] 正在错误地抽牌。它不是抽取阵列的最后一张牌,而是抽取倒数第二张。有什么想法吗?
  • @BenToscano,我认为 draw 方法没有任何问题。你怎么知道它是倒数第二个?您是否在未洗牌的牌组上进行测试?
  • 我发现当我尝试调用(例如)NSLog(@"This card is draw:%@", [self.deckObject deal]) - 它实际上是调用 [self .deckObject deal] 并处理一张新牌(因此看起来好像一张牌被“跳过”了。希望能够解决这个问题。
【解决方案2】:

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

@interface firstViewController : UIViewController {
    Deck *DeckObject;
}

现在在 viewController.m 文件的 viewDidLoad 方法中初始化它,如下所示

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

之后就可以调用uibutton的action方法中的方法了

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多