0

Я пытаюсь решить одну архитектурную проблему, но я хочу найти подходящий подход.Как уведомить родительский класс от ребенка?

У меня есть игровая сцена GameLayer.h, которая является моей точкой зрения в этом случае. У меня также класс GameEngine, который я пытаюсь быть контроллером. У меня есть свой пользовательский класс Egg, полученный из CCNode и некоторая таймерная логика, реализованная по расписанию в классе Egg. У меня есть много объектов Egg на игровой сцене, добавленной с помощью метода addChild. Так GameEngine.m импортирует GameLayer.h и GameLayer.m импортирует Egg.h

После таймера в каждом Egg работает, я хочу получать уведомления, то есть выполнить некоторые действия, увеличить счет и т.д. Вопрос, что лучший способ реализации такой ситуации. Кроме того, я хочу подчиняться правилу MVC Быстрые решения, которые приходит на мой взгляд, являются

  1. Включите Gamelayer.h в классе Egg и вызвать некоторый метод обновления в этом. Обновите представление (self) и сообщите GameEngine, чтобы сохранить новый балл.
  2. Включите Gamelayer.h в класс Egg и вызовите в нем некоторый метод обновления. В методе обновления вызовите другой метод обновления, который теперь находится в GameEngine.h, а теперь из GameEngine save score и обновите Gamelayer (вид)
  3. Внедрите KVO. Проблема заключается в том, что я никогда не делал это раньше, я не знаю, наблюдатель должен быть GameLayer или GameEngine

Пожалуйста, помогите, любые примеры оценены

+1

Вы лучше всего, вероятно, номер 3. Все, что действует в отношении информации, должно соблюдаться. Просто не забудьте отменить регистрацию наблюдателя, когда закончите. – dqhendricks

ответ

1

Больше вариантов:

1. Использование NSNotificationCenter. Ваши яйца будут отправлять уведомления, и ваш GameLayer будет наблюдать.

2. Использовать protocol. Пример:

// in Egg.h 

@class Egg; 
@protocol EggDelegate 
// an example method 
-(void)egg:(Egg *)egg hadSomethingHappen:(int)parameter; 
@end 

@interface Egg: CCNode 
@property (weak) id<EggDelegate> delegate; 
@end 

// in Egg.m 
/// something happened and delegate has to be notified? 
[self.delegate egg:self hadSomethingHappen:someNumber]; 

Затем объявить GameLayer поддерживать этот протокол:

@interface GameLayer : CCLayer <EggDelegate> 

реализации методов ПРОТОКОЛ в GameLayer и сделать его делегатом ваших объектов Яичные:

// somewhere in GameLayer 
Egg *egg = [Egg node]; 
egg.delegate = self; 

... 

//protocol implementation 
-(void)egg:(Egg *)egg hadSomethingHappen:(int)parameter 
{ 
// do something 
} 
+0

Большое спасибо, я буду использовать делегацию – Grixol

Смежные вопросы