IBoutlet collection.UIButton添加目标

时间:2012-02-05 21:16:22

标签: objective-c xcode

我对Xcode和Obj-C的了解几乎是不存在的,所以如果我提出一个愚蠢/错误的问题,请理解。

我在界面构建器中添加了一系列按钮。 现在我想将这些按钮链接到一个函数(让我们说更改标签的文本) 但是每个按钮应该能够通过发送某种类型的参数来改变文本。

-(IBAction)changeText:(NSString *) theString{
    myLabel.text=theString;
}

当我向按钮添加动作时,我会使用类似的东西。

[but1 addTarget:self action:@selector(changeText : myString[1]) 
    forControlEvents:UIControlEventTouchUpInside];

第二个按钮:

[but2 addTarget:self action:@selector(changeText : myString[2]) 
    forControlEvents:UIControlEventTouchUpInside];

如此......

我的问题是: 如果我有大量的按钮,我可以在一个循环中声明它们并同时向它们添加适当的动作吗?我该怎么做?

1 个答案:

答案 0 :(得分:2)

按钮调用的方法格式是固定的。你不能传递任意参数,比如字符串,你只能传递任何东西,或者按钮本身。

此代码无法编译:

[but1 addTarget:self action:@selector(changeText : myString[1]) forControlEvents:UIControlEventTouchUpInside];

因为myString [1]部分会使您的选择器无效。选择器只是方法名称,您不能在其中放置参数。该按钮决定调用方法时要传递的参数,并且它总是自行传递。你有两个选择,你可以给每个按钮自己的方法,如下所示:

[but1 addTarget:self action:@selector(changeText1) forControlEvents:UIControlEventTouchUpInside];
[but1 addTarget:self action:@selector(changeText2) forControlEvents:UIControlEventTouchUpInside];
etc...

请注意,changeText方法末尾缺少冒号,因为我们没有使用button参数。然后,您可以将方法定义为:

-(IBAction)changeText1 {
    myLabel.text= myString[1];
}

-(IBAction)changeText2 {
    myLabel.text = myString[2];
}

但这不是很容易扩展。另一种方法是使用按钮的某些属性,例如它的标题或标记来分支代码。我认为标签适用于您的目的:

[but1 addTarget:self action:@selector(changeText:) forControlEvents:UIControlEventTouchUpInside];
but1.tag = 1; // this will match the index of the string you want to display

请注意,changeText:selector的末尾有一个冒号。这意味着我们希望按钮在调用我们的方法时将其自身作为参数传递。 changeText方法现在看起来像这样:

-(IBAction)changeText:(UIButton *)theButton {
    NSInteger stringIndex = theButton.tag;
    myLabel.text = myString[stringIndex];
}