Доступ к объекту из класса (+) метод класса в iPhone и Cocos2d? - PullRequest
3 голосов
/ 31 января 2012

У меня есть метод класса, в котором я создаю и возвращаю объект класса. Но я хочу получить доступ к определенным свойствам этого объекта в том же классе. Будучи методом класса, я не могу объявить переменную в файле .h и позже обращаться к ней в других методах. Ниже приведен код Как я могу получить доступ к значениям объекта backsprite или hudlayer в методе экземпляра ниже ??

    // class 1

+(id)HUDWithBackgroundSprite:(NSString *)spriteName withRect:(CGRect)rect atPoistion:(HUDPosition)pos
{

  HUDlayer *hud = [[HUDlayer alloc] init];

  CCSprite *backSprite = [CCSprite spriteWithFile:spriteName];
  [backSprite setContentSize:CGSizeMake(rect.size.width,rect.size.height)];
  [backSprite setPosition:ccp(rect.origin.x,rect.origin.y)];
  [backSprite setTag:100];
  [hud addChild:backSprite];
  [hud setTag:2];

  return [hud autorelease];
}


// access it here

-(void)AddButtonToHUDWithImage:(NSString *)imageName selector:(SEL)selector withDisabledImage:(NSString *)disbdImageName
{
  HUDlayer *hud = (HUDlayer *)[self getChildByTag:2];

  CCMenuItem *menuItem1 = [CCMenuItemImage itemFromNormalImage:imageName selectedImage:imageName disabledImage:disbdImageName target:self selector:@selector(selector)];

  CCMenu *menu = [CCMenu menuWithItems:menuItem1,nil];

  CCSprite *sprite = (CCSprite *)[hud getChildByTag:100];

  CGPoint pos = sprite.position;
  //pos =[[CCDirector sharedDirector]convertToGL:pos];

  [menu setPosition:ccp(pos.x+160,pos.y-30)];

  [hud addChild:menu];
}

// class 2

+(CCScene *) scene
{
  // 'scene' is an autorelease object.
  CCScene *scene = [CCScene node];

    HUDlayer *hud = [HUDlayer node];
  //  [scene addChild:hud z:1];

  // 'layer' is an autorelease object.
  HelloWorldLayer *layer = [[[HelloWorldLayer alloc]initWithHUD:hud]autorelease];

  // add layer as a child to scene 
  [scene addChild: layer];

  id mainHuds = [HUDlayer HUDWithBackgroundSprite:HUDBackground withRect:CGRectMake(160,450, 300,60) atPoistion:pos_Top];

  SEL callOnClick;
  [mainHuds AddButtonToHUDWithImage:ButtonBackground selector:callOnClick withDisabledImage:disabledBackground];

  [scene addChild: mainHuds];

  // return the scene
  return scene;
}

Я не могу получить к нему доступ через теги, так как объект HUDlayer в методе + здесь не добавлен, а в другом классе, который вызывает метод.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2012

Вы можете абсолютно в статическом методе экземпляра доступа к классу / переменной-члена этого класса, ЕСЛИ у вас есть указатель / ссылка на экземпляр этого класса.Вот простой пример ... извините, если есть опечатки ...

// HUDLayer.h

@interface HUDLayer : CCLayer
{
    NSString* aString;
}

@property (nonatomic, retain) NSString* aString;

+(void)modifyInstanceString:(HUDLayer*)hud;

// HUDLayer.m

@implementation HUDLayer

@synthesize aString;

-(id)init
{
    if ((self=[super init]))
    {
        self.aString = @"initial value";
    }
    CCLOG(@"Initial value = %@", self.aString);
    return self;
}

+(void)modifyInstanceString:(HUDLayer*)hud
{
    hud.aString = @"Something else";
    CCLOG(@"Modified aString via static method = %@", hud.aString);
}

@end

// HelloWorldLayer.m (или где угодно)

HUDLayer* hud = [[HUDLayer alloc] init];
[HUDLayer modifyInstanceString:hud];
1 голос
/ 31 января 2012

Нет причины, по которой вы не можете объявить объект как переменную в вашем .h файле:

HUDlayer * hud;

Именно так методы этого класса будут обращаться к нему. Если вы получаете ошибки, я могу только предположить, что формат вашего .h файла неправильный. Я обычно настраиваю сцену и слой так:

@interface ExampleLayer : CCLayer
{       
        //vars
}

//methods

@end

@interface ExampleScene : CCScene 
{   
    ExampleLayer *layer;
}

@end
0 голосов
/ 31 января 2012

В статических методах могут использоваться только статические переменные ... Объявите объект в файле .h как Static HUDlayer * hud;и получить доступ к нему с помощью имени класса ... Тем не менее M не может понять, почему вы создаете столько статических методов, поскольку они очень тяжелые и предварительно загружены, даже если вам не нужен этот класс ....

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