На более высоком уровне я бы создал базовый класс C ++ с точными аргументами / именами (возможно, даже self и _cmd). Где-то вам нужно будет создать их и установить соединения от менеджера к запрашиваемым объектам.
Объекты objc могут содержать указатель на их реализацию / приемник C ++, или вы можете использовать индекс, или вы можете использовать self и подход хеш / карта.
Таким образом, менеджер может удерживать коллекцию получателей событий, а затем UIView реализует метод, который будет перенаправлять сообщение менеджеру для анализа команды (что вы делаете с командами / событиями ??).
В качестве альтернативы, если вам нужна только реализация, просто используйте ObjectiveC ++ и добавьте приемник / процессор событий в качестве ивара в UIResponder.
Добавление: добавлен быстрый пример псевдокода для «затем просто используйте ObjectiveC ++ и добавьте приемник / процессор событий в качестве ивара для UIResponder».
// Mr.Gando:
// To answer your question about what do I need to do with events,
// for example I need to subscribe a button to the manager, so when
// it get's touched, a method "Fire" is called... just an example,
// but I think your answer is good. Does this Manager have to be
// thread safe ?
/////////////////////////////////////////////////////////////////////
/* not declared in event_manager_t's scope, so that objc only files may declare members without error - if all your code is objc++, then relocate */
class mon_event_manager_event_handler_t {
/* ... */
void touchesBegan(id sender, NSSet * touches, UIEvent * event) {
assert(sender && touches && event);
assert(this->getResponder() && this->getResponder() == sender);
if (this->getResponder() && this->getResponder() == sender && this->isSubscribed() && this->isInterestedInTouchesBeganEvents()) {
SharedEventManager().touchesBegan(this, sender, touches, event);
}
}
private:
UIResponder * responder_;
UInt32 flags_EventsOrActionsOfInterest_;
bool isSubscribed_;
};
/** implement as singleton */
class event_manager_t {
/* ... */
void touchesBegan(handler_t* const handler, id sender, NSSet * touches, UIEvent * event) {
this->fire();
}
void fire() {
NSLog(@"Fire()");
/* you can message anything here, just realize that events may not occur on the recipient's work thread */
}
static mon_event_manager_event_handler_t* CreateNextHandler(UIResponder * responder) {
/* SharedEventManager() must guard its data here */
mon_event_manager_event_handler_t* result(SharedEventManager().createOrReuseHandler());
result->setResponder(responder);
SharedEventManager().registerNewHandler(handler);
return result;
}
static void RemoveHandler(mon_event_manager_event_handler_t* handler) {
/* SharedEventManager() must guard its data here */
SharedEventManager().removeHandler(handler);
}
};
/** @return the event_manager_t singleton object */
event_manager_t& SharedEventManager();
/////////////////////////////////////////////////////////////////////
struct mon_event_manager_event_handler_t;
@interface MonResponder
{
mon_event_manager_event_handler_t* handler_;
}
@end
/////////////////////////////////////////////////////////////////////
@implementation MonResponder
/* ... */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
assert(handler_ && "TODO: create the handler");
handler_->touchesBegan(self, touches, event);
/* ... */
}
@end
/////////////////////////////////////////////////////////////////////