当多个IBActions为同一事件提供时,IBActions会触发哪些命令

时间:2011-11-18 17:00:42

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

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

无论我如何尝试,我似乎无法改变动作触发的顺序。我有办法决定这一点,还是随意的?

当我在Interface Builder中右键单击UIButton时,我看到两个Actions都添加到同一个事件中,但无论它们出现在哪个顺序,点火顺序都会发生变化。

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

3 个答案:

答案 0 :(得分:2)

UIButtons是UIControl的子类,它使用目标操作模式来传递事件。添加目标的编程接口通过addTarget:action:forControlEvents:方法公开。在界面构建器中连接IBActions只是使用同一界面的直观方式;当加载包含它的.xib文件时,bundle loader将在unarchived按钮上调用该方法。

关键是该方法中的target参数在内部被UIControl添加到NSSet(或可变子类)中。根据定义,NSSets是无序的。这意味着当按钮需要枚举其目标集以分派事件时,枚举的顺序没有很好地定义。

答案 1 :(得分: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;

动作)G:(ID)发送者;

**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]事件中的Button。您将找到相同的输出,如下所示:

<强>输出

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

干杯!!

快乐编码!!

答案 2 :(得分:0)

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

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