【问题标题】:UIControlEvents variable from a string来自字符串的 UIControlEvents 变量
【发布时间】:2012-08-16 18:44:54
【问题描述】:

是否可以从NSString 或类似的变量创建UIControlEvents 变量?例如,我可能有一个名为UIControlEventTouchUpInsideNSString,它与UIControlEvents 变量的类型定义之一相同。

感谢大家的帮助!

【问题讨论】:

    标签: objective-c ios xcode nsstring uicontrolevents


    【解决方案1】:

    如果我理解它是如何正常工作的,UIControlEvents 枚举如下:

    enum {
       UIControlEventTouchDown           = 1 <<  0,
       UIControlEventTouchDownRepeat     = 1 <<  1,
       UIControlEventTouchDragInside     = 1 <<  2,
       UIControlEventTouchDragOutside    = 1 <<  3,
       UIControlEventTouchDragEnter      = 1 <<  4,
       UIControlEventTouchDragExit       = 1 <<  5,
       UIControlEventTouchUpInside       = 1 <<  6,
       UIControlEventTouchUpOutside      = 1 <<  7,
       UIControlEventTouchCancel         = 1 <<  8,
    
       UIControlEventValueChanged        = 1 << 12,
    
       UIControlEventEditingDidBegin     = 1 << 16,
       UIControlEventEditingChanged      = 1 << 17,
       UIControlEventEditingDidEnd       = 1 << 18,
       UIControlEventEditingDidEndOnExit = 1 << 19,
    
       UIControlEventAllTouchEvents      = 0x00000FFF,
       UIControlEventAllEditingEvents    = 0x000F0000,
       UIControlEventApplicationReserved = 0x0F000000,
       UIControlEventSystemReserved      = 0xF0000000,
       UIControlEventAllEvents           = 0xFFFFFFFF
    };
    

    再一次,如果我理解正确,如果我错了,请纠正我,但你应该能够制作一个变量整数并将其传递给控制事件,如下所示:

        int myVariable = 64;
        [myButton addTarget:self action:@selector(mySelector) forControlEvents:myVariable];
    

    Bitwise Shift Left的解释见此链接

    【讨论】:

    • 好的,这样就可以了。但是我不相信这个事件是正确的。因为当我有 6 个事件时,它似乎只适用于 UIControlEventTouchDragInside 而不是 UIControlEventTouchUpInside。
    • @ManOx 抱歉,本例中 touchUpInside 为 64。此外,请参阅我的编辑以获取指向描述正确使用按位左移运算符的站点的链接。
    • 完美。实际上,我最终只是做了一些明智的转变: UIControlEvents eventForSelector = 1
    • 您也可以将它们直接传递给按钮,例如:forControlEvents:0xFFFFFFFF
    • @NSPostWhenldle 谢谢,但那是什么类型的变量?它似乎是十六进制的,但是如何在 Objective-C 中声明一个十六进制值?
    【解决方案2】:

    您必须创建自己的字典才能从一个映射到另一个:

    NSDictionary * const controlEventTypesFromStrings = @{
         @"UIControlEventTouchDown" : @(UIControlEventTouchDown),
         @"UIControlEventTouchDownRepeat" : @(UIControlEventTouchDownRepeat),
    
         //etc.
    

    这是新的Clang literal syntax;您当然可以使用旧的/标准的[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInteger:UIControlEventTouchDown], @"UIControlEventTouchDown", ...

    制作字典

    然后使用你的字符串,你会从字典中得到一个NSNumber

    NSNumber * eventTypeNum = controlEventTypesFromStrings[stringDescribingControlEvent];
    UIControlEvents eventType = [eventTypeNum unsignedIntegerValue];
    

    如果您不使用新的下标语法,则可以通过 objectForKey: 检索 NSNumber

    【讨论】:

      【解决方案3】:

      这里有一些描述 UIControlEvents 位掩码中位的快速代码:

      - (NSString *)describeEvents:(UIControlEvents)event {
          NSDictionary *events = @{@0: @"UIControlEventTouchDown",
                                   @1: @"UIControlEventTouchDownRepeat",
                                   @2: @"UIControlEventTouchDragInside",
                                   @3: @"UIControlEventTouchDragOutside",
                                   @4: @"UIControlEventTouchDragEnter",
                                   @5: @"UIControlEventTouchDragExit",
                                   @6: @"UIControlEventTouchUpInside",
                                   @7: @"UIControlEventTouchUpOutside",
                                   @8: @"UIControlEventTouchCancel",
      
                                   @12: @"UIControlEventValueChanged",
                                   @13: @"UIControlEventPrimaryActionTriggered",
      
                                   @16: @"UIControlEventEditingDidBegin",
                                   @17: @"UIControlEventEditingChanged",
                                   @18: @"UIControlEventEditingDidEnd",
                                   @19: @"UIControlEventEditingDidEndOnExit"};
      
          NSMutableString *result = [[NSMutableString alloc] init];
          for(int i = 0; i<sizeof(UIControlEvents) * CHAR_BIT; i++) {
              if((event & ((NSUInteger)1 << i)) != 0) {
                  NSString *eventName = [events objectForKey:[NSNumber numberWithInt:i]];
                  if(!eventName)
                      eventName = [NSString stringWithFormat:@"%i", i];
      
                  if(result.length > 0)
                      [result appendString:@", "];
                  [result appendString:eventName];
              }
          }
      
          return result;
      }
      

      示例输出:

      [self describeEvents:UIControlEventTouchCancel] // UIControlEventTouchCancel
      
      [self describeEvents:UIControlEventAllTouchEvents] // UIControlEventTouchDown, UIControlEventTouchDownRepeat, UIControlEventTouchDragInside, UIControlEventTouchDragOutside, UIControlEventTouchDragEnter, UIControlEventTouchDragExit, UIControlEventTouchUpInside, UIControlEventTouchUpOutside, UIControlEventTouchCancel, 9, 10, 11
      
      [self describeEvents:UIControlEventAllEvents] // UIControlEventTouchDown, UIControlEventTouchDownRepeat, UIControlEventTouchDragInside, UIControlEventTouchDragOutside, UIControlEventTouchDragEnter, UIControlEventTouchDragExit, UIControlEventTouchUpInside, UIControlEventTouchUpOutside, UIControlEventTouchCancel, 9, 10, 11, UIControlEventValueChanged, UIControlEventPrimaryActionTriggered, 14, 15, UIControlEventEditingDidBegin, UIControlEventEditingChanged, UIControlEventEditingDidEnd, UIControlEventEditingDidEndOnExit, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-10
        • 2013-06-11
        • 1970-01-01
        • 2021-09-17
        • 2013-01-13
        • 1970-01-01
        • 2021-07-13
        • 2017-04-18
        相关资源
        最近更新 更多