Objective c IBoutlet collection.ui按钮添加目标

Objective c IBoutlet collection.ui按钮添加目标,objective-c,xcode,Objective C,Xcode,我对Xcode和Obj-C的了解几乎是不明确的,所以如果我提出了一个愚蠢/表述不当的问题,请理解 我在界面生成器中添加了一系列按钮。 现在我想将这些按钮链接到一个函数(比如更改标签的文本) 但是每个按钮都应该能够通过发送某种参数来改变文本 -(IBAction)changeText:(NSString *) theString{ myLabel.text=theString; } 当我向按钮添加一个动作时,我会使用类似这样的东西 [but1 addTarget:self action:

我对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];
等等

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

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

此代码不会编译:

[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...
-(IBAction)changeText:(UIButton *)theButton {
    NSInteger stringIndex = theButton.tag;
    myLabel.text = myString[stringIndex];
}
注意changeText方法末尾缺少冒号,因为我们没有使用button参数。然后将方法定义为:

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

-(IBAction)changeText2 {
    myLabel.text = myString[2];
}
但这不是很容易扩展。另一种方法是使用按钮的某些属性,例如它的标题或标记来分支代码。我认为tag会很好地满足您的需求:

[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 now的末尾有一个冒号。这意味着我们希望按钮在调用我们的方法时将自身作为参数传递。changeText方法现在将如下所示:

[but1 addTarget:self action:@selector(changeText1) forControlEvents:UIControlEventTouchUpInside];
[but1 addTarget:self action:@selector(changeText2) forControlEvents:UIControlEventTouchUpInside];
etc...
-(IBAction)changeText:(UIButton *)theButton {
    NSInteger stringIndex = theButton.tag;
    myLabel.text = myString[stringIndex];
}

你提供的代码可以编译吗?你可能不想用IBOutlet来做这类事情,你在NSArray中制作按钮,但是IBOutlet不知道它们的存在。我从头开始写代码。它需要更多的伪代码。我只是想说明一下主要思想。Anon在上面提出了一个很好的观点,顺便说一下,您可以将方法定义为(void)而不是iAction,因为iAction没有任何意义,除非您在Interface Builder中绑定它们。不过,这两种方法都可以使用。此外,您可以在Interface Builder中设置标记,这样您就可以使用IB中的拖放功能将所有按钮绑定到同一个changeText方法,然后避免在代码循环中绑定所有按钮,这将使您无需为所有按钮创建出口,或者通过代码中的标记获取它们。这正是我想要的。你真漂亮。非常感谢。