代码之家  ›  专栏  ›  技术社区  ›  Brian

UIKit中是否有内置事件处理的基类/实用程序类?

  •  1
  • Brian  · 技术社区  · 13 年前

    我正在寻找一个具有“事件列表”的类,该类类似于UIButton的工作方式,您可以在其中添加多个目标和选择器。

    写一个很容易,但如果苹果已经提供了一个解决方案,我宁愿使用它,也不愿维护更多的代码。

    注:

    这是一个非可视化类,所以我不想使用任何特定于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
    
    1 回复  |  直到 13 年前
        1
  •  5
  •   rob mayoff    13 年前

    UIButton 是的子类 UIControl UI控件 管理每个控制事件的目标/动作列表。它有一组预定义的控制事件,如 UIControlEventTouchUpInside UIControlEventValueChanged 每个控制事件由掩码中的一个比特表示。位掩码为应用程序定义的事件保留了四个位( UIControlEventApplicationReserved = 0x0F000000 )。

    如果 UI控件 没有按您的意愿进行,您将需要推出自己的事件管理。

    推荐文章