1

複数のターゲットとセレクターを追加できる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
4

1 に答える 1

5

UIButtonのサブクラスですUIControlUIControl各制御イベントのターゲット/アクションリストを管理します。となどの事前定義された制御イベントのセットがUIControlEventTouchUpInsideありUIControlEventValueChangedます。各制御イベントは、マスク内のビットで表されます。ビットマスクには、アプリ定義のイベント用に予約された4ビットがあります(UIControlEventApplicationReserved = 0x0F000000)。

希望どおりの結果が得られない場合UIControlは、独自のイベント管理を行う必要があります。

于 2012-07-22T19:36:59.460 に答える