如何将(id)发件人添加到以下-(IBAction)?
Posted
技术标签:
【中文标题】如何将(id)发件人添加到以下-(IBAction)?【英文标题】:How to add (id) sender to the following -(IBAction)? 【发布时间】:2010-01-12 04:03:05 【问题描述】:如何在以下代码中添加(id)发件人?
- (IBAction) gobutton: (UIButton *) button5
我尝试的一切都失败了,任何帮助将不胜感激。谢谢。
编辑:我需要在 (IBAction) 中保留 (UIButton *) 按钮 5 引用
【问题讨论】:
【参考方案1】:如果我没记错的话,如果你以我认为的方式使用它,
- (IBAction) gobutton: (id) sender
if(sender == button5)
//do something...
else
//do something else...
假设您将 button5 指定为参数以指示此操作响应 button5 被按下而执行。
【讨论】:
【参考方案2】:好的,首先....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 似乎有点不寻常....
【讨论】:
【参考方案3】:不清楚您要做什么,但大多数操作看起来像:
- (IBAction) gobutton: (id)sender;
【讨论】:
我需要 -(IBAction) 上的 (UIButton *) button5 和 (id) sender action 通常通过传递 sender 的 id 来调用,这样你就可以查询 sender,如果 button5 连接到 gobutton action 那么 id sender 就是你的 button5 ... 是的,如果动作连接到按钮,那么发送者就是按钮【参考方案4】:动作的第一个参数是始终是发送者(您可以根据需要指定类型和名称)。
如果方法是按钮的操作,那么第一个参数将是按钮。如果该方法是多个按钮的操作,那么第一个参数将允许您确定点击了哪个按钮(如 Leper 所述)。
你真正想解决什么问题? 有一些技术可以将信息传递给操作方法。例如,如果您有一个显示在表格视图单元格上的按钮并对每个单元格执行相同的操作,那么在 action 方法中,您可能希望能够确定点击了哪个单元格的按钮。
【讨论】:
我遇到的问题是我正在尝试使用以下代码: [(goGOAppDelegate *)[[UIApplication sharedApplication] delegate] goFlip: (id) sender];但是,我收到一条错误消息,指出“发件人”未正确声明,唯一的问题是我无法将 -(IBAction) 设为发件人,因为需要 (UIButton *) button5 在 IBAction 中定义此部分: gorev2 = (button5.tag == BUTTON7) 如果您直接调用一个方法,那么它不必是 IBAction,也不必有任何参数。同样,您可能需要就您正在尝试做的事情提供更多更高级别的信息——这看起来不像您正在采用典型的方法。 @unknown: button5 是什么?谁调用了这个-gobutton:
方法?【参考方案5】:
如何在用户触摸控件之前获取发送者的 id?
找到了!设置标签并使用viewWithTag。
【讨论】:
【参考方案6】:你能创建一个包含 UIButton 和发送者的简单结构并使用它吗?
结构我的对象 UIButton* 按钮5; 身份证发件人;
...或者,您可以创建自己的 NSObject(可能更可可):
@instance myObject : NSObject ...
【讨论】:
不。目标/动作有一个非常具体的模式;一个参数,发送者。以上是关于如何将(id)发件人添加到以下-(IBAction)?的主要内容,如果未能解决你的问题,请参考以下文章
UITablewView 和 IBAction 发件人的问题
如何在 Swift 4 中以编程方式将 IBAction 添加到按钮?