2012-01-31 3 views
3

私はクラスオブジェクトを作成して返すクラスメソッドを持っています。 しかし、私は同じクラスのそのオブジェクトの特定のプロパティにアクセスしたいと思います。クラスメソッドであるので、私は変数を.hファイルで宣言することはできず、後で他のメソッドでそれにアクセスすることはできません。以下はコードです 以下のインスタンスメソッドでbackspriteまたはhudlayerオブジェクトの値にアクセスするにはどうすればいいですか?iPhoneおよびCocos2dのクラスタイプ(+)メソッドからオブジェクトにアクセスしますか?

// 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オブジェクトがここに追加されていないかのように、タグを使用してますがメソッドを呼び出して、他のクラスでそれにアクセスすることはできませんよ。

+0

私はあなたがあなたの.hファイルでそれを宣言できないのですか?アクセスする唯一の方法は、変数が.hファイル内にある場合です。 – xuanweng

+0

これはクラスメソッドではアクセスされないインスタンス変数です。インスタンスメソッド – hemant

答えて

4

クラスのインスタンスへのポインタ/参照がある場合は、そのクラスのクラスアクセスインスタンス/メンバ変数の静的メソッドに絶対に入れることができます。ここでは簡単な例です...申し訳ありません、タイプミス...

// 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]; 
+0

ええ、それはかなりシンプルでした。なぜ私はそれを考えるのdidk .. – hemant

1

あなたの.hファイル内の変数としてオブジェクトを宣言することはできません理由はありません。

HUDlayer * HUDが。

これは、そのクラスのメソッドがアクセスする方法とまったく同じです。エラーが発生した場合は、.hファイルのレイアウトが間違っているとしか思えません。私は、通常そのようにシーンとレイヤーを設定します

@interface ExampleLayer : CCLayer 
{  
     //vars 
} 

//methods 

@end 

@interface ExampleScene : CCScene 
{ 
    ExampleLayer *layer; 
} 

@end 
0

のみ静的変数は静的メソッドで使用することができます... は静的HUDlayer * HUDとして.hファイル内のオブジェクトを宣言します。 クラス名でアクセスしてください... 非常に重いので、あまりにも多くの静的メソッドを作成している理由をまだ理解できません。クラスを必要としなくてもプリロードされています。

+0

静的変数のみが静的メソッド(またはクラスメソッド)で使用されます。ヒープに割り当てられたオブジェクトをここで使用できます。また、オブジェクト参照を呼び出し元に返し、ビュー階層に追加した場合(暗黙的に保持されていた場合)、後のルーチンは階層から取得できます。 – ZhangChn

+0

は、jer答えの助けを借りてより良い方法を見つけました.. 2つの静的メソッドしかありませんでした。 – hemant

関連する問題