Cocos2d iphone 将委托设置为推送场景的父对象

Cocos2d iphone 将委托设置为推送场景的父对象,cocos2d-iphone,delegates,Cocos2d Iphone,Delegates,在我的HelloWorldLayer代码中,我将SettingsLayer场景推到堆栈上 [[CCDirector sharedDirector] pushScene:[CCTransitionFade transitionWithDuration:0.5 scene:[SettingsLayer scene]]]; SettingsLayer需要调用在HelloWorldLayer中实现的委托方法。但我不知道如何将HelloWorldLayer设置为SettingsLayer

在我的HelloWorldLayer代码中,我将SettingsLayer场景推到堆栈上

        [[CCDirector sharedDirector] pushScene:[CCTransitionFade transitionWithDuration:0.5 scene:[SettingsLayer scene]]];

SettingsLayer需要调用在HelloWorldLayer中实现的委托方法。但我不知道如何将HelloWorldLayer设置为SettingsLayer的代理。有人能告诉我这个的正确样式吗?我尝试了SettingsLayer的alloc init,并在pushscene之前设置代理,但没有成功。

在您的代码中:

SettingsLayer *mySettingsLayer = [[SettingsLayer alloc] init]; 
mySettingsLayer.delegate = self; 
[[CCDirector sharedDirector] pushScene:[CCTransitionFade transitionWithDuration:0.5 
                                 scene:[[mySettingsLayer class] scene]]];
问题在最后一行:

[[mySettingsLayer class] scene]
这将创建一个没有委托集的
SettingsLayer
类的新实例(它将为nil)。您以前创建的
mySettingsLayer
实际上不是作为场景显示的,它超出了范围并取消分配(假设您使用的是ARC,如果不是,这实际上会泄漏
mySettingsLayer
对象)

要修复它,请将其传递到已存在的
mySettingsLayer
实例中:

[[CCDirector sharedDirector] pushScene:[CCTransitionFade transitionWithDuration:0.5 
                                 scene:mySettingsLayer]];

“我尝试了SettingsLayer的alloc init,并在pushscene之前设置代理”这部分应该可以工作。不知道为什么它不适合你。尝试在该静态场景方法中传递代理对象,并在其中设置代理。以下操作没有成功:SettingsLayer*mySettingsLayer=[[SettingsLayer alloc]init];mySettingsLayer.delegate=self;[[CCDirector sharedDirector]推送场景:[CCTransitionFade transitionWithDuration:0.5场景:[[mySettingsLayer类]场景]];显示您失败尝试的代码,以便我们有机会指出代码中或多或少明显的错误。仅仅说“它不起作用”就剥夺了我们改正错误的机会。。。呃,帮助你编辑您的问题,而不是发表评论。我马上就有答案。这很有效,谢谢。为了消除pushScene中的警告,我不得不将mySettingsLayer设置为(CCScene*)。这意味着我根本不需要使用传统的(?)“+scene”方法?我只是直接使用cclayer并将其转换为场景?如果您需要转换它,则意味着您的SettingsLayer类不会从CCScene继承。+scene方法只是一种方便的方法,可以为您执行alloc/init/(autorelease)。便利类方法(+scene)获取该层,将其添加到场景并返回一个场景。但是我的委托属性位于CCLayer中。如果我们坚持使用HelloWorldLayer模式,我想我会访问代理属性,作为场景的子对象访问该层。创建层后,只需创建一个ccscene,设置层deletate,将子层添加到场景,然后按相同的方法推送场景