Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios (id)发送者有什么区别?_Ios_Objective C_Sdk - Fatal编程技术网

Ios (id)发送者有什么区别?

Ios (id)发送者有什么区别?,ios,objective-c,sdk,Ios,Objective C,Sdk,像这样在Xcode中声明UIButton有什么区别: - (IBAction)testButton; - (IBAction)testButton:(id)sender; - (IBAction)testButton:(id)sender { // insert code here.. } 并声明如下按钮: - (IBAction)testButton; - (IBAction)testButton:(id)sender; - (IBAction)testButton:(id)send

像这样在Xcode中声明UIButton有什么区别:

- (IBAction)testButton;
- (IBAction)testButton:(id)sender;
- (IBAction)testButton:(id)sender
{
// insert code here..
}
并声明如下按钮:

- (IBAction)testButton;
- (IBAction)testButton:(id)sender;
- (IBAction)testButton:(id)sender
{
// insert code here..
}
我知道在.m文件中,您将相应地实现按钮,如下所示:

- (IBAction)testButton
{
// insert code here..
}
然后像这样设置它:

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

通过使用:idsender声明按钮,您还可以执行其他操作吗?是否有其他稳定性,或者是否没有区别?

使用:idsender,您可以通过sender变量访问按钮本身。这在很多情况下都很方便。例如,您可以有许多按钮,并为每个按钮指定一个标记。然后使用[sender tag]方法查找在多个按钮使用此iAction时点击的按钮。

使用:idsender,您可以通过sender变量访问按钮本身。这在很多情况下都很方便。例如,您可以有许多按钮,并为每个按钮指定一个标记。然后使用[sender tag]方法查找多个按钮正在使用此iAction时点击的按钮。

它允许您知道正在使用的按钮。下面我发布了一个简单的纸牌游戏示例

- (IBAction)flipCard:(id)sender {
    [self.game flipCardAtIndex:[self.cardButtons indexOfObject:sender]];
    self.flipCount++;
    [self updateUI];
}

此方法用于翻牌游戏。屏幕上有多个按钮代表不同的卡片。当您按下按钮时,模型中的一张卡必须翻转。通过查找变量发送器的索引,我们可以知道是哪一个,它允许您知道正在使用哪个按钮。下面我发布了一个简单的纸牌游戏示例

- (IBAction)flipCard:(id)sender {
    [self.game flipCardAtIndex:[self.cardButtons indexOfObject:sender]];
    self.flipCount++;
    [self updateUI];
}
此方法用于翻牌游戏。屏幕上有多个按钮代表不同的卡片。当您按下按钮时,模型中的一张卡必须翻转。我们通过找到变量发送者的索引来知道是哪一个

使用idsender,您可以引用发送方法调用的人。请注意,这不必限于UIButton

如果您是通过从故事板拖动控件创建此方法的,并且仅连接一个按钮,那么发送者基本上是无用的,它将始终是相同的,并且可能应标记为未使用:

#pragma unused (sender)
如果这样做,编译器可以更好地优化代码

但是,将多个UI元素连接到同一个iAction方法并没有错。然后,您可以通过以下方式区分发件人:

[sender tag]
…返回通过情节提要或编程方式设置的int

此外,您可以在类中的其他位置调用此方法。您可以将nil作为发送方传递,也可以将其传递给特定的UI元素,以便将其强制输入到为该标记的对象编写的结果中

尽管如此,如果计划使用nil参数调用该方法,则始终可以抛出:

if(!sender)
。。。当通过编程而不是通过用户交互调用该方法时,可以处理该方法的特殊逻辑

使用idsender,您可以引用发送方法调用的人。请注意,这不必限于UIButton

如果您是通过从故事板拖动控件创建此方法的,并且仅连接一个按钮,那么发送者基本上是无用的,它将始终是相同的,并且可能应标记为未使用:

#pragma unused (sender)
如果这样做,编译器可以更好地优化代码

但是,将多个UI元素连接到同一个iAction方法并没有错。然后,您可以通过以下方式区分发件人:

[sender tag]
…返回通过情节提要或编程方式设置的int

此外,您可以在类中的其他位置调用此方法。您可以将nil作为发送方传递,也可以将其传递给特定的UI元素,以便将其强制输入到为该标记的对象编写的结果中

尽管如此,如果计划使用nil参数调用该方法,则始终可以抛出:

if(!sender)

。。。进入该方法,以便在以编程方式而不是通过用户交互调用该方法时处理特殊逻辑。

并且不要忘记第三个选项:-IBActiontestButton:idsender forEvent:UIEvent*事件。请参阅文档了解UIControl addTarget:action:forControlEvents:。它们是两种不同的方法;一个不带参数,一个只带一个参数。框架将它们视为相同的方法是一个实现细节。@bbum您能详细说明第二句话吗?@JackyBoy XIB实现-围绕目标/操作的实现-允许操作方法成为三种不同形式之一。它们确实是不同的方法,您选择哪一种取决于您的需要。不要忘记第三个选项:-IBActiontestButton:idsender forEvent:UIEvent*事件。请参阅文档了解UIControl addTarget:action:forControlEvents:。它们是两种不同的方法;一个不带参数,一个只带一个参数。框架将它们视为相同的方法是一个实现细节。@bbum您能详细说明第二句话吗?@JackyBoy the
XIB实现——围绕目标/行动的实现——允许行动方法是三种不同形式之一。它们确实是不同的方法,您选择哪一种取决于您的需要。它是id,而不是UIButton。@nhgrif id或UIButton都可以。id是所有对象的通用类型,UIButton更具体。层次结构,我的朋友:我理解,但IB会给你id,在这种情况下最好使用id。为什么?UIButton可以使代码更具可读性。最后,它在任何情况下都是一个UIButton。我能看到使用id的唯一原因是代码重复使用。我想我应该为你们炸毁我的收件箱投一票:pIt'd id,而不是UIButton。@nhgrif id或UIButton都可以。id是所有对象的通用类型,UIButton更具体。层次结构,我的朋友:我理解,但IB会给你id,在这种情况下最好使用id。为什么?UIButton可以使代码更具可读性。最后,它在任何情况下都是一个UIButton。我能看到使用id的唯一原因是代码重复使用。我想我应该为你们炸毁我的收件箱投上一票:据我所知,pragma unused不影响编译的代码,只是沉默了未使用的变量警告,这在这种情况下是不必要的。我很想找到一个链接,链接到有关pragma unused影响代码生成的更多信息。@Dearden知道一点点上下文允许编译器相应地进行优化。Ctrl+F未使用我不知道它的细节,但我倾向于相信NSHipster的东西。谢谢你链接到NSHipster。我之前很感兴趣,但测试表明,在汇编语言中,将变量标记为未使用变量并没有什么不同。我相信LLVM足够聪明,不需要指针,至少在ARC下是这样。据我所知,pragma unused不会影响编译的代码,只会使未使用的变量警告静音,这在这种情况下是不必要的。我很想找到一个链接,链接到有关pragma unused影响代码生成的更多信息。@Dearden知道一点点上下文允许编译器相应地进行优化。Ctrl+F未使用我不知道它的细节,但我倾向于相信NSHipster的东西。谢谢你链接到NSHipster。我之前很感兴趣,但测试表明,在汇编语言中,将变量标记为未使用变量并没有什么不同。我相信LLVM足够聪明,至少在ARC下不需要指针。