如何将(id)发件人添加到以下 - (IBAction)?

时间:2010-01-12 04:03:06

标签: iphone objective-c iphone-sdk-3.0 uibutton cocoa-design-patterns

如何将(id)发件人添加到以下代码中?

- (IBAction) gobutton: (UIButton *) button5 {

我尝试的一切都失败了,任何帮助都会受到赞赏。感谢。

编辑:我需要在(IBAction)中保留(UIButton *)按钮5参考

6 个答案:

答案 0 :(得分:5)

如果我没记错的话,如果你按照我认为的方式使用它,

- (IBAction) gobutton: (id) sender {
if(sender == button5)
   //do something...
else
   //do something else...
}

假设您将button5指定为参数,以指示这是为了响应button5被按下而执行。

答案 1 :(得分:3)

好的,首先.... IBAction除了Interface Builder之外并没有什么特别的意义。基本上是:

#define IBAction void

因此,每当您看到IBAction时,请考虑“无效”。它的唯一原因是作为一个标志告诉Interface Builder一个方法是一个连接控制动作的有效方法。 Objective-C编译器不需要知道它,因此它被定义为void,因为所有“action”方法都返回void。

其次,动作方法也有一个参数,可以是任意类型的对象。因此,动作方法应该使用类型id作为其参数的类型。这样,它们就可以传递给任何Objective-C对象的指针,而不会导致编译器生成类型检查错误。

所以通常行动应该是这样的:

- (IBAction)myAction:(id)sender {
    if (sender == self.someButton) {
        UIButton *button = (UIButton *)sender;
        ...
        return;
    } else if (sender == self.someControl) {
        UIControl *control = (UIControl *)sender;
        ...
        return;
    }
}

换句话说,id几乎就像一个类似于void *的无类型指针,当一些函数需要指向未知类型的某个函数时,它通常在C中使用。 sender可以是不同类型的控件,因此使用像id这样的通用名称,然后一旦代码知道它是什么,就将发送者转换为更具体的内容。

无论如何,除非您要在Interface Builder中将该方法用作目标操作,否则绝对没有理由将某些内容定义为具有IBAction的返回类型。在您的应用代理中使用IBAction似乎有点不寻常......

答案 2 :(得分:2)

目前尚不清楚你要做什么,但大多数行动都是这样的:

- (IBAction) gobutton: (id)sender;

答案 3 :(得分:1)

操作的第一个参数始终是发件人(您可以根据需要指定类型和名称)。

如果方法是按钮的操作,则第一个参数将是按钮。如果该方法是多个按钮的操作,则第一个参数将允许您确定点击了哪个按钮(如Leper所述)。

您实际上试图解决什么问题?
有一些技术可以将信息传递给action方法。例如,如果您有一个显示在表格视图单元格上的按钮并对每个单元格执行相同的操作,那么在操作方法中,您可能希望能够确定点击了哪个单元格的按钮。

答案 4 :(得分:0)

如何在用户触摸控件之前获取发件人的ID?

发现它!设置标签并使用viewWithTag。

答案 5 :(得分:-3)

您是否可以创建一个包含UIButton和发件人的简单结构并使用它?

struct myObject {     UIButton * button5;     身份发件人; }

......或者,您可以创建自己的NSObject(可能更多可可):

@instance myObject:NSObject {    ... }