如何在Objective C中单击按钮传入参数?

时间:2011-08-09 20:25:57

标签: objective-c cocoa-touch

所以我尝试将参数传递给我的“buttonClicked”函数,以便我可以动态控制单击按钮时发生的情况。我尝试自己做的每一种方式都会破坏我的代码。我在stackOverflow上搜索过很多不同的网站和答案,但我似乎无法找到答案。我对目标C相当新,特别是对于函数,所以我真的可以使用一些帮助来弄清楚如何做到这一点。提前致谢

到目前为止,这是我的代码以及我要做的事情:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
NSLog(@"Hi 1!");

[button addTarget:self action:@selector(buttonClicked:buttonType:buttonID:) forControlEvents:UIControlEventTouchUpInside];

button.frame = CGRectMake(buttonViewXvalue, buttonViewYvalue, buttonViewWidth, buttonViewLength);

[self.view addSubview:button];  

然后是头文件中的声明:

- (IBAction)buttonClicked:(id)sender theButtonType: (int)buttonType: theButtonID: (int) buttonID;

和实施:

- (IBAction)buttonClicked:(id)sender theButtonType: (int)buttonType: theButtonID: (int)    buttonID 
{
//Here I would use the buttonType and buttonID to create a new view. 
NSLog(@"Hi!");

}

4 个答案:

答案 0 :(得分:8)

您不能对addTarget:action:forControlEvents:使用多参数方法。相反,您可以设置按钮的tag,然后根据标记查找信息。

答案 1 :(得分:2)

您添加到UIButton(或任何UIControl)的操作必须具有由target-action设计模式定义的(void)actionName(void)actionName:(id)sender;等签名。

这为您提供了两个简单的解决方案。一个是你的每个按钮调用不同的(void)actionName - 类似方法,然后在自己上调用更复杂的方法并传递所需的参数。其他方法是给你的每个按钮一个标签属性,并让它们调用(void)actionName:(id)sender - 类似方法(它们都可以调用相同的方法),然后根据此标记使用正确的参数调用正确的方法:

- (void)actionName:(UIButton)sender;
{
    if (sender.tag == 1) {
        [self firstMethodWithString:someString andNumber:someNumber];
    } else if (sender.tag == 2) {
        [self secondMethodWithArray:someArray dictionary:someDictionary andColor:someColor];
    } // and so on
}

注意我在这里如何将发件人从id更改为UIButton。这使您可以在不进行强制转换的情况下调用标记而不会收到编译器警告,因为编译器知道您只希望UIButton实例调用此方法。

答案 2 :(得分:1)

如果您真的想要,可以为每个按钮创建单独的回调,例如:

// In your Whatever.h file
- (IBOutlet)actionButton1:(UIButton *)sender;
- (IBOutlet)actionButton2:(UIButton *)sender;

// In your Whatever.m file
- (IBOutlet)actionButton1:(UIButton *)sender
{
  // do button 1 specific stuff
}

- (IBOutlet)actionButton2:(UIButton *)sender
{
  // do button 2 specific stuff
}
// etc you get the idea

然后从Interface Builder中查看您的Whatever.xib文件。您可以将“触摸内部”的“已发送事件”(从右侧列拖动)链接到上面的任何操作,这些操作将在“文件所有者”中弹出(左列,当您释放拖动时)。您可以为每个按钮执行不同的操作。

我应该提一下,如果这些是相同功能的变体,那么使用UIButton的tag属性会更有意义。

答案 3 :(得分:0)

我用一个对象数组解决了这个问题:所有参数都存储在一个对象中,然后将对象插入到数组中,最后,数组中对象的索引在TAG属性中传递按钮。此技术适用于一个或多个按钮。我为一个有联系人列表的应用程序做了这个,你可以用按钮接受或拒绝它们,这个按钮调用相同的动作方法,感谢TAG可以知道哪些参数发送到数据库。步骤进行:

1-创建一个新类:New File,Objective-C类,命名它,NSOBJECT的子类,保存它。

2-在这个新类的标题中,为每个参数声明一个属性。

3-现在转到你的按钮所属的viewcontroller类的IMPLEMENTATION文件。

4-导入新课程:     #import" new_class.h"

5-在INTERFACE部分声明数组:

@interface my_viewcontroller ()
{ NSMutableArray * my_array; }

6-在VIEWDIDLOAD方法中,将数组创建为空:

my_array = [ [ NSMutableArray alloc ] initWithObjects : nil ];

7-在获取参数数据的方法中,声明新类的对象,实例化它并填充属性:

new_class * nc;
nc = [ [ new_class alloc ] init ];
nc.param1 = @"abc";
nc.param2 = 123;
nc.param3 = true;

8-现在将其插入数组:

[ my_array addObject : nc ];

9-将值0存储在按钮的TAG中。您将使用此值作为索引来访问my_array [0]位置中的参数。

如果有更多按钮,例如,来自返回JSON数据的Web服务,则只需遍历数据,创建新类的更多实例并将其插入到数组中。稍后,例如,在带有动态单元格的表视图和带按钮的模板单元格中,在方法CELLFORROWATINDEXPATH中,您将能够将INDEXPATH值存储在每个按钮的TAG中,因此这些按钮将访问它们自己的参数。