«Карта» может не отвечать на «-fadeAway» - PullRequest
0 голосов
/ 08 июля 2010

У меня есть подкласс класса Card из UIView и класс Deck из NSObject. У Card есть несколько целочисленных свойств поверх унаследованных UIView, а в Deck есть NSMutableArray для хранения некоторых карт. После создания колоды карт я хочу отобразить случайно выбранную карту (добавив ее в суперпредставление). Прежде чем сделать это, я проверяю, есть ли карта, я вызываю метод, чтобы освободить ее, прежде чем запрашивать новую. Но я получаю предупреждение в заголовке. Вот код ...


#import <UIKit/UIKit.h>
#import "Card.h"
#import "Deck.h"

@interface FlashTestViewController : UIViewController {

Deck*       aDeck;
Card*       aCard;
}

- (IBAction)generateDeck;
- (IBAction)generateCard;
- (void)fadeAway:(id)sender;

@end

#import "FlashTestViewController.h"

@implementation FlashTestViewController

- (IBAction)generateDeck {

    if (aDeck != nil) {
        [aDeck release];
    }

    aDeck = [[Deck alloc] initDeckWithOperator:@"+"];
}


- (IBAction)generateCard {

    if (aCard != nil) {
        [aCard fadeAway];
    }

    aCard = [aDeck newCardFromDeck];
    [self.view addSubview:aCard];
}

- (void)fadeAway:(id)sender {
    [aCard removeFromSuperview];
    [aCard release];
    }

Я новичок в программировании (кроме Basic!), Так что я все еще оборачиваюсь вокруг всего объекта. Спасибо за любую помощь и / или совет!

EDIT: Вот код карты и колоды ...


#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@class Card;

@interface Card : UIView {

int         upperOperand;
int         lowerOperand;
NSString*   theOperator;
int         theResult;
}

@property(nonatomic) int upperOperand;
@property(nonatomic) int lowerOperand;
@property(nonatomic, retain) NSString* theOperator;
@property(nonatomic) int theResult;

@end

#import "Card.h"


@implementation Card

@synthesize upperOperand;
@synthesize lowerOperand;
@synthesize theOperator;
@synthesize theResult;

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
    // Initialization code
    self.backgroundColor = [UIColor redColor];
    self.layer.cornerRadius = 15;
    self.alpha = 0.3;
    self.layer.borderColor = [[UIColor blueColor] CGColor];
    self.layer.borderWidth = 4;
    }
    return self;
}

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

@end

#import <Foundation/Foundation.h>
#import "Card.h"

@class Deck;

@interface Deck : NSObject {

NSMutableArray* cards;
}

@property(nonatomic, retain) NSMutableArray* cards;

- (id)initDeckWithOperator: (NSString*)mathOper;
- (id)newCardFromDeck;

@end

#import "Deck.h"

@implementation Deck

@synthesize cards;

- (id)initDeckWithOperator: (NSString*)mathOper {
    if (cards != nil) {
    [cards release];
    }
    cards = [[NSMutableArray alloc] init];
    for (int i=0; i<11; i++) {
        for (int j=0; j<11; j++) {
            Card* aCard = [[Card alloc] initWithFrame:CGRectMake(10, 10, 60, 80)];
            aCard.upperOperand = i;
            aCard.lowerOperand = j;
            aCard.theOperator = mathOper;
            aCard.theResult = i + j;
            [cards addObject: aCard];
            [aCard release];
        }
    }
    return self;
}

- (id)newCardFromDeck {
    int index = random() % [cards count];
    Card* selectedCard = [[cards objectAtIndex:index] retain];
    [cards removeObjectAtIndex:index];
    return selectedCard;
}

@end

Ответы [ 3 ]

4 голосов
/ 08 июля 2010

Вы определили метод fadeAway для класса FlashTestViewController, а не для класса Card. Это означает, что вы можете вызывать этот метод (или отправлять сообщение в зависимости от предпочитаемой вами терминологии ООП) только для экземпляров класса Card.

, поэтому [aCard fadeAway] неверно, поскольку принимает неверное количество параметров, а также потому, что aCard является экземпляром класса Card, а метод fadeAway: для этого класса не определен (ну, мы не видим определение, так что, возможно, это так, но не так заметно).

Но вы не показали определение класса Card, поэтому, возможно, вы действительно определите метод там.

1 голос
/ 08 июля 2010

Вы объявили fadeAway как принимающий один параметр типа id, поэтому вы должны вызывать его таким образом. Итак:

[aCard fadeAway:nil];

Кроме того, поскольку он никогда ничего не делает со своим аргументом, вы можете просто объявить его как не принимающий его, а затем назвать его как есть. Итак:

-(void)fadeAway;

// later
[aCard fadeAway];
0 голосов
/ 08 июля 2010

Вам нужно дать aCard и (id)sender, как вы указали в своих параметрах. Вы не даете достаточно аргументов, чтобы выразить это другими словами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...