我对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];
如此......
我的问题是: 如果我有大量的按钮,我可以在一个循环中声明它们并同时向它们添加适当的动作吗?我该怎么做?
答案 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];
}