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];

还有更好的办法,欢迎各位交流!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值