Objective c 如何在目标C中单击按钮时传入参数?

Objective c 如何在目标C中单击按钮时传入参数?,objective-c,cocoa-touch,Objective C,Cocoa Touch,因此,我尝试将参数传递给我的“buttonClicked”函数,这样我就可以动态控制单击按钮时发生的情况。我自己尝试的每一种方法都会破坏我的代码。我在stackOverflow上搜索了许多不同的网站和答案,但似乎找不到答案。我对objective C相当陌生,尤其是在函数方面,所以我真的需要一些帮助来弄清楚如何做到这一点。提前谢谢 以下是迄今为止我的代码和我正在尝试的操作: UIButton *button = [UIButton buttonWithType:UIButtonTypeCusto

因此,我尝试将参数传递给我的“buttonClicked”函数,这样我就可以动态控制单击按钮时发生的情况。我自己尝试的每一种方法都会破坏我的代码。我在stackOverflow上搜索了许多不同的网站和答案,但似乎找不到答案。我对objective 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!");

}

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

您添加到UIButton的操作(或任何与此相关的UIControl)必须具有类似
(void)actionName
(void)actionName:(id)sender由设计模式定义

这就给出了两个简单的解决方案。一种是,每个按钮都调用不同的类
(void)actionName
-方法,然后该方法在self上调用更复杂的方法并传递所需的参数。另一种方法是给每个按钮一个标记属性,让它们调用
(void)actionName:(id)sender
-like方法(它们都可以调用相同的方法),然后根据此标记使用正确的参数调用正确的方法:

- (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实例调用此方法。

如果确实需要,可以为每个按钮创建单独的回调,如:

// 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属性更有意义。

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

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

2-在此新类的标头中,为每个参数声明一个属性

3-现在转到按钮所属的viewcontroller类的实现文件

4-导入新类: #导入“new_class.h”

5-在接口部分声明数组:

@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存储在按钮的标记中。您将使用此值作为索引来访问my_数组[0]位置中的参数


例如,如果有更多按钮来自返回JSON数据的web服务,只需在数据中循环创建新类的更多实例并将它们插入数组中即可。稍后,例如,在带有动态单元格的tableview和带有按钮的template单元格中,在方法CellForRowatineXpath中,您将能够在每个按钮的标记中存储INDEXPATH值,因此这些按钮将访问它们自己的参数。

这是严格正确的,当然有一种方法是使用NSInvocation作为目标(以invoke作为操作),指向可以调用块并将块作为调用的第一个参数的人?这很复杂,必须有一种更简单的方法将块打包为可以通过传统目标/操作机制传递的对象?好的,你可以在UIButton上将其打包为一个类别,这很好。回答很好,感谢你花时间解释这实际上是如何工作的。我可能会做一些类似于您在这里列出的第二个选项的事情。再次感谢您的快速回复!顺便说一句,有一个丢失的*(UIButton*)发送器