【发布时间】:2011-05-02 14:15:21
【问题描述】:
在我的项目中,我必须控制 40 个按钮的动作,但我不想创建 40 个 IBAction,我可以只使用一个 IBAction,如何?
【问题讨论】:
标签: ios objective-c ibaction
在我的项目中,我必须控制 40 个按钮的动作,但我不想创建 40 个 IBAction,我可以只使用一个 IBAction,如何?
【问题讨论】:
标签: ios objective-c ibaction
如果您使用界面生成器来创建按钮,只需将它们指向相关类中的相同 IBAction。
然后,您可以通过读取按钮中的文本来区分 IBAction 方法中的按钮...
- (IBAction)buttonClicked:(id)sender {
NSLog(@"Button pressed: %@", [sender currentTitle]);
}
...或者通过在 Xcode 中设置tag 属性并通过[sender tag] 读回它。 (如果您使用这种方法,请从 1 开始标记,因为 0 是默认值,因此几乎没有用处。)
【讨论】:
IBACTION 方法,然后删除除一个之外的所有内容。
-(IBAction)myButtonAction:(id)sender {
if ([sender tag] == 0) {
// do something here
}
if ([sender tag] == 1) {
// Do something here
}
}
// in Other words
-(IBAction)myButtonAction:(id)sender {
switch ([sender tag]) {
case 0:
// Do something here
break;
case 1:
// Do something here
break;
default:
NSLog(@"Default Message here");
break;
}
【讨论】:
将所有按钮设置为使用该一项操作。动作通常有一个sender 参数,您可以使用它来确定哪个按钮正在调用该动作。区分按钮的一种流行方法是为每个按钮的tag 属性分配不同的值。因此,您可能有 40 个按钮,其标签范围从 1 到 40。(0 可能不是标签的好选择,因为这是默认值,并且您忘记设置标签的任何按钮都将 0 作为标记值。)
当所有按钮的功能大致相同时,这种技术最有用,例如计算器或键盘上的按钮。如果每个按钮做的事情完全不同,那么你仍然会得到相当于 40 个方法的结果,但是你用你自己的 switch 语句代替了 Objective-C 的消息传递系统。在这种情况下,最好只花时间创建尽可能多的操作,并适当地分配它们。
【讨论】:
当然。只需将所有按钮连接到 Interface Builder 中的相同操作方法。使用方法的sender 参数(可能与按钮的tag 属性结合使用)来识别哪个按钮正在发送事件。
【讨论】:
只需使用一个 IBAction 并将其分配给您的所有按钮。
【讨论】:
我自己只是用了上面的方法,有几个按钮,但都转换了,改用switch case
-(IBAction)buttons:(id)sender
{
switch ([sender tag])
{
case 0 :
}
}
【讨论】:
似乎您已获得所需的所有答案,但我想添加到其他所有人的答案中。
您要使用一个 IBAction 还是 40 个操作取决于您希望按钮执行的操作。如果所有按钮都做完全不同的事情,您需要所有单独的 IBAction,但如果您希望所有按钮都做同样的事情,您可以只使用一个。我需要有关这些按钮和操作的更多详细信息,但您可能有每个按钮的标题,因此您可以使用它来区分每个按钮并创建一条消息或由按下的特定按钮自定义的内容。这是示例。每次按下按钮时,标签都会显示一条消息,上面写着“按下按钮的标题”。
通过这种方式,您无需对所有 40 种模式进行 switch case。只需 2-3 行代码,您仍然可以通过按下按钮来显示或执行个性化的操作。
- (IBAction)button_Clicked:(UIButton *)sender {
//Get the buttons' titles.
NSString *title =[sender titleForState:UIControlStateNormal];
//Construct a message that includes the *title.
NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];
//Assigns the *plainText to the label.
self.Label.text=plainText;
}
@end
【讨论】: