有什么区别:(id)发件人?

时间:2014-01-20 22:20:55

标签: ios objective-c sdk

在Xcode中声明UIButton之间的区别是什么:

- (IBAction)testButton;

并声明一个这样的按钮:

- (IBAction)testButton:(id)sender;

据我所知,在.m文件中,您可以相应地实现按钮,如下所示:

- (IBAction)testButton
{
// insert code here..
}

并将其设置为:

- (IBAction)testButton:(id)sender
{
// insert code here..
}

通过声明按钮:(id)发件人,是否有一些额外的稳定性,或者没有区别,你还能做些什么吗?

3 个答案:

答案 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

的索引来了解哪一个