【问题标题】:What ordes does the IBActions fire in when multiple IBActions supplied for same event当为同一事件提供多个 IBAction 时,IBAction 会触发什么命令
【发布时间】:2011-11-18 17:00:41
【问题描述】:

根据我的标题,我正在构建一个包含一些 UIButton 的视图。 我正在考虑将 2 个动作连接到一个 UIButton 事件,因为该按钮需要做两件事,但我需要按特定顺序执行它们。

无论我如何尝试,我似乎都无法更改动作触发的顺序。有没有办法让我决定这个,还是随机的?

当我在 Interface Builder 中右键单击 UIButton 时,我看到两个动作都添加到了同一个事件中,但无论它们出现的顺序如何,触发顺序都会发生变化。

希望你们中的一些人可以帮助我。

【问题讨论】:

    标签: objective-c ios interface-builder xcode4.2 ios5


    【解决方案1】:

    UIButton 是 UIControl 的子类,它使用目标动作模式来传达事件。添加目标的编程接口通过addTarget:action:forControlEvents: 方法公开。在界面生成器中连接 IBActions 只是使用相同界面的一种可视化方式;加载包含它的 .xib 文件时,捆绑加载器将在未归档按钮上调用该方法。

    关键是该方法中的target 参数是由UIControl 在内部添加到NSSet(或可变子类)的。根据定义,NSSet 是无序的。这意味着当按钮需要枚举它的一组目标来调度事件时,枚举的顺序并没有很好地定义。

    【讨论】:

      【解决方案2】:

      你不会在任何书籍甚至谷歌搜索中得到这个问题的答案。

      我亲自尝试过,它根据 IBActions 名称按字母顺序工作。奇怪但这是事实!!

      下面的测试示例:

      helloworld.h

      -(IBAction)a:(id)sender;
      -(IBAction)b:(id)sender;
      -(IBAction)c:(id)sender;
      -(IBAction)d:(id)sender;
      -(IBAction)e:(id)sender;
      -(IBAction)f:(id)sender;
      

      Action)g:(id)sender;

      **HelloWorld.m file**
      
      -(IBAction)a:(id)sender
      {
          NSLog(@"I clicked a");
      }
      -(IBAction)f:(id)sender
      {
          NSLog(@"I clicked f");
      }
      -(IBAction)b:(id)sender
      {
          NSLog(@"I clicked b");
      }
      -(IBAction)c:(id)sender
      { 
          NSLog(@"I clicked c");
      }
      -(IBAction)d:(id)sender
      {
          NSLog(@"I clicked d");
      }
      -(IBAction)e:(id)sender
      {
          NSLog(@"I clicked e");
      }
      

      现在在 [Touch Up Inside] 事件中以任意顺序将这些操作链接到您的按钮。您会发现如下所示的相同输出:

      输出

      2012-03-19 15:35:34.548  I clicked a
      2012-03-19 15:35:34.554  I clicked b
      2012-03-19 15:35:34.564  I clicked c
      2012-03-19 15:35:34.566  I clicked d
      2012-03-19 15:35:34.568  I clicked e
      2012-03-19 15:35:34.572  I clicked f
      

      干杯!!

      编码愉快!!

      【讨论】:

      • 我很想知道这是否是您将它们添加到控件中的顺序
      • 看起来很合理。这已经在我的应用程序中造成了一段时间的问题。
      【解决方案3】:

      由于没有明确的方法来指示发送操作的顺序,因此您应该依赖于顺序。相反,创建一个单独的操作,以所需的顺序调用您关心的两个操作:

      - (IBAction)doFooAndBar:(id)sender
      {
          [self foo:sender];
          [self bar:sender];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多