cocos2d子层访问父层的三种方法

情景设定:父层HelloWorldLayer有一个方法-(void) setlable;需要被其子层SecondLayer访问。

第一种、半单例方法:

首先在HelloWorldLayer.h声明+(HelloWorldLayer*) shareLayer

+(HelloWorldLayer*) shareLayer;

然后在HelloWorldLayer.m加入:

#import "SecondLayer.h"static HelloWorldLayer* HelloWorldLayerInstance;+(HelloWorldLayer*) shareLayer{    return HelloWorldLayerInstance;}-(id) init{    // always call "super" init    // Apple recommends to re-assign "self" with the "super" return value    if( (self=[super init])) {        HelloWorldLayerInstance=self;                SecondLayer* sl=[[SecondLayer alloc] init];        sl.tag=10;        [self addChild:sl z:100];        self.isTouchEnabled=YES;                ////.................           }    return self;}-(void) setlable{    clickNum++;    [label setString:[NSString stringWithFormat:@"ParentLayer clickNum:%i",clickNum]];}

在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法:

[[HelloWorldLayer shareLayer] setlable];

第二种、self.parent强制访问方法:

HelloWorldLayer中只需按正常添加子层SecondLayer即可(HelloWorldLayer.m中):

-(id) init{    // always call "super" init    // Apple recommends to re-assign "self" with the "super" return value    if( (self=[super initWithColor:ccc4(0, 255, 255,255)])) {        HelloWorldLayerInstance=self;                SecondLayer* sl=[[SecondLayer alloc] init];        sl.tag=10;        [self addChild:sl z:100];        self.isTouchEnabled=YES;                ////.................           }    return self;}

在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法:

[(HelloWorldLayer*)self.parent setlable];

第三种、协议委托方法:

在SecondLayer.h中加入:

#import <Foundation/Foundation.h>#import "cocos2d.h"@protocol callParentDelegate <NSObject>-(void) setlable;@end@interface SecondLayer : CCLayer{    id<callParentDelegate> delegate;}@property(nonatomic,retain) id<callParentDelegate> delegate;@end
SecondLayer.m中@synthesize delegate;

然后在HelloWorldLayer.h中加入<callParentDelegate>协议:

@interface HelloWorldLayer :CCLayer <callParentDelegate>{    CCLabelTTF *label;    int clickNum;}

在HelloWorldLayer.m中实现:

-(void) setlable{    clickNum++;    [label setString:[NSString stringWithFormat:@"ParentLayer clickNum:%i",clickNum]];}

在添加SecondLayer子层注意设子委托:

        SecondLayer* sl=[[SecondLayer alloc] init];        sl.tag=10;        sl.delegate=self;        [self addChild:sl z:100];        self.isTouchEnabled=YES;

在SecondLayer就可以通过这样的方式来访问HelloWorldLayer的-(void) setlable方法:

[self.delegate setlable];

还有更好的办法,欢迎各位交流!

猜你喜欢

转载自aijuans2.iteye.com/blog/1624588
今日推荐