【发布时间】:2010-01-12 04:03:05
【问题描述】:
如何在以下代码中添加(id)发件人?
- (IBAction) gobutton: (UIButton *) button5 {
我尝试的一切都失败了,任何帮助将不胜感激。谢谢。
编辑:我需要在 (IBAction) 中保留 (UIButton *) 按钮 5 引用
【问题讨论】:
标签: iphone objective-c iphone-sdk-3.0 uibutton cocoa-design-patterns
如何在以下代码中添加(id)发件人?
- (IBAction) gobutton: (UIButton *) button5 {
我尝试的一切都失败了,任何帮助将不胜感激。谢谢。
编辑:我需要在 (IBAction) 中保留 (UIButton *) 按钮 5 引用
【问题讨论】:
标签: iphone objective-c iphone-sdk-3.0 uibutton cocoa-design-patterns
如果我没记错的话,如果你以我认为的方式使用它,
- (IBAction) gobutton: (id) sender {
if(sender == button5)
//do something...
else
//do something else...
}
假设您将 button5 指定为参数以指示此操作响应 button5 被按下而执行。
【讨论】:
好的,首先....IBAction 并没有什么特别的意义,除了 Interface Builder。基本上:
#define IBAction void
因此,每当您看到 IBAction 时,请想一想“无效”。它存在的唯一原因是作为一个标志来告诉 Interface Builder 方法是连接控制操作的有效方法。 Objective-C 编译器不需要知道它,因此它被定义为 void,因为所有“动作”方法都返回 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 这样的通用控件,然后在代码知道它是什么后将 sender 强制转换为更具体的控件。
无论如何,绝对没有理由将返回类型定义为 IBAction,除非您打算将该方法用作 Interface Builder 中的目标操作。在您的应用委托中包含 IBAction 似乎有点不寻常....
【讨论】:
不清楚您要做什么,但大多数操作看起来像:
- (IBAction) gobutton: (id)sender;
【讨论】:
动作的第一个参数是始终是发送者(您可以根据需要指定类型和名称)。
如果方法是按钮的操作,那么第一个参数将是按钮。如果该方法是多个按钮的操作,那么第一个参数将允许您确定点击了哪个按钮(如 Leper 所述)。
你真正想解决什么问题?
有一些技术可以将信息传递给操作方法。例如,如果您有一个显示在表格视图单元格上的按钮并对每个单元格执行相同的操作,那么在 action 方法中,您可能希望能够确定点击了哪个单元格的按钮。
【讨论】:
-gobutton: 方法?
如何在用户触摸控件之前获取发送者的 id?
找到了!设置标签并使用viewWithTag。
【讨论】:
你能创建一个包含 UIButton 和发送者的简单结构并使用它吗?
结构我的对象 { UIButton* 按钮5; 身份证发件人; }
...或者,您可以创建自己的 NSObject(可能更可可):
@instance myObject : NSObject { ... }
【讨论】: