複数のターゲットとセレクターを追加できるUIButtonの動作に似た「イベントリスト」を持つクラスを探しています。
書くのは簡単ですが、Appleがすでに解決策を提供しているのであれば、維持するコードを増やすよりも、これを使用したいと思います。
ノート:
これは非ビジュアルクラス用であるため、UI固有のものは使用したくありません。
編集:
スタックされたNSDictionaryインスタンスを使用して、独自の基本的なイベントディスパッチャータイプのクラスをロールすることになりました。
@implementation ControllerBase
@synthesize eventHandlers;
- (id) init
{
self = [super init];
if (self!=NULL)
{
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
[self setEventHandlers: dict];
[dict release];
}
return self;
}
-(void) addTarget: (id) target action:(SEL) selector forEvent:(NSString*) eventName
{
NSString* selectorString = NSStringFromSelector(selector);
NSMutableDictionary* eventDictionary = [eventHandlers objectForKey:eventName];
if (eventDictionary==NULL)
{
eventDictionary = [[NSMutableDictionary alloc] init];
[eventHandlers setValue:eventDictionary forKey:eventName];
}
NSArray* array = [NSArray arrayWithObjects:selectorString,target, nil];
[eventDictionary setValue:array forKey: [target description]];
}
-(void) removeTarget: (id) target action:(SEL) selector forEvent:(NSString*) eventName;
{
NSMutableDictionary* eventDictionary = [eventHandlers objectForKey:eventName];
//must have already been removed
if (eventDictionary!=NULL)
{
//remove event
[eventDictionary removeObjectForKey:target];
//remove sub dictionary
if ([eventDictionary count]==0)
{
[eventHandlers removeObjectForKey:eventName];
[eventDictionary release];
}
}
}
-(void) fireEvent:(NSString *)eventName
{
NSMutableDictionary* eventDictionary = (NSMutableDictionary*) [eventHandlers objectForKey:eventName];
if (eventDictionary!=NULL)
{
for(id key in eventDictionary)
{
NSArray* eventPair= [eventDictionary valueForKey:key];
if (eventPair!=NULL)
{
NSString* selectorString = (NSString*)[eventPair objectAtIndex:0];
//remove colon at end
SEL selector = NSSelectorFromString ( [selectorString substringWithRange: NSMakeRange(0, [selectorString length]-1)] ) ;
id target = [eventPair objectAtIndex:1];
[target performSelector:selector];
}
}
}
}
-(void) dealloc
{
for(id key in eventHandlers)
{
NSMutableDictionary* eventDictionary = (NSMutableDictionary*) [eventHandlers objectForKey:key];
for(id key in eventDictionary)
{
[eventDictionary removeObjectForKey:key];
}
[eventDictionary release];
}
[eventHandlers release];
[super dealloc];
}
@end