根据我的标题,我正在构建一个包含UIButton的视图。 我正在考虑将2个动作连接到一个UIButton事件,因为该按钮需要做两件事,但我需要按照一定的顺序执行它们。
无论我如何尝试,我似乎无法改变动作触发的顺序。我有办法决定这一点,还是随意的?
当我在Interface Builder中右键单击UIButton时,我看到两个Actions都添加到同一个事件中,但无论它们出现在哪个顺序,点火顺序都会发生变化。
希望你们中的一些人可以帮助我。
答案 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];
}