在Xcode中声明UIButton之间的区别是什么:
- (IBAction)testButton;
并声明一个这样的按钮:
- (IBAction)testButton:(id)sender;
据我所知,在.m文件中,您可以相应地实现按钮,如下所示:
- (IBAction)testButton
{
// insert code here..
}
并将其设置为:
- (IBAction)testButton:(id)sender
{
// insert code here..
}
通过声明按钮:(id)发件人,是否有一些额外的稳定性,或者没有区别,你还能做些什么吗?
答案 0 :(得分:3)
使用:(id)发件人,您可以通过sender变量访问按钮本身。这在许多情况下都很方便。例如,您可以拥有许多按钮并为每个按钮添加标签。然后使用[sender tag]方法查找如果许多按钮正在使用此IBAction,则点击了哪个按钮。
答案 1 :(得分:1)
- (IBAction)someMethod:(id)sender {
// do stuff
}
使用(id)sender
,您可以参考发送方法调用的人。请注意,这不必限于UIButton
。
如果您通过控制拖动从故事板中创建此方法只挂钩一个按钮,那么sender
基本上是无用的(它将始终是相同的),并且应该被标记为未使用:
#pragma unused (sender)
(如果你这样做,编译器可以更好地优化你的代码。)
但是,将多个UI元素连接到同一个IBAction
方法没有任何问题。然后,您可以通过以下方式区分发件人:
[sender tag]
...返回通过故事板或以编程方式设置的int
。
此外,您可以在班级的其他地方调用此方法。您可以将nil
作为发件人传递,也可以将其传递给特定的UI元素,以强制它为您为该标记的对象编码的结果。
但是,如果您计划使用nil
参数调用该方法,则可以始终抛出:
if(!sender)
...进入方法,以便在以编程方式调用方法时处理特殊逻辑,而不是通过用户交互。
答案 2 :(得分:0)
它可以让您知道您正在使用哪个按钮。我已经发布了一个简单的卡片游戏示例
- (IBAction)flipCard:(id)sender {
[self.game flipCardAtIndex:[self.cardButtons indexOfObject:sender]];
self.flipCount++;
[self updateUI];
}
此方法用于卡片翻转游戏。屏幕上有多个代表不同卡片的按钮。按下按钮时,必须翻转模型中的卡片。我们通过查找变量sender