Я не уверен, что это та же проблема, но недавно я обнаружил, что если я хочу использовать replaceScene для переключения между двумя сценами, где я хочу сохранить "старую" сцену как одиночную, которая может если вернуться к более позднему, то вызов replaceScene в итоге вызовет «очистку» в этой сцене, которая оставляет сцену нетронутой, за исключением того, что любые кнопки, имеющие обработчики в виде блоков или селекторов (которые обертываются блоками внутри), теряют свои обработчики перестать отвечать на запросы, когда вы вернетесь к «старой» сцене.
Я сделал это так, чтобы приложение не всегда создавало совершенно новые объекты сцены (вместе со всеми своими детьми) каждый раз, когда пользователь переходит из главного меню в другую часть приложения.
Чтобы обойти это, мне пришлось либо переделать дизайн, чтобы сцены всегда создавались заново каждый раз, когда происходит переход, либо добавить твик в CCDirector:
-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup
На данный момент я добавил в CCDirector.replaceScene переопределение, которое принимает параметр очистки (аналогично другим сообщениям removeAndCleanup). Это позволяет соответствующему приложению сохранять сцены, когда оно хочет, без их очистки, когда приложение не хочет их очищать.
Реализация для этого:
-(void) replaceScene: (CCScene*) scene
{
[self replaceScene:scene andCleanup:YES];
}
-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup
{
NSAssert( scene != nil, @"Argument must be non-nil");
NSUInteger index = [scenesStack_ count];
sendCleanupToScene_ = andCleanup;
[scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
nextScene_ = scene; // nextScene_ is a weak ref
}
Если кто-то думает, что это глупый путь, пожалуйста, дайте мне знать.