为什么performSelector:afterDelay:立即在我的iPhone应用程序中行动?

时间:2011-03-09 03:41:46

标签: iphone objective-c

我试图弄清楚如何使用performSelector:afterDelay:在按钮执行其功能之前创建一个5秒的暂停。我从没有延迟的版本开始:

-(IBAction)immediateActivate:(id)sender {
switch1.on = YES;
}

效果很好。按下按钮,开关打开。

然后我做了以下操作来创建延迟:

-(IBAction)delayedActivate:(id)sender
{
[self performSelector:@selector(immediateActivate) withObject:nil afterDelay: 5.0];
}

-(void)immediateActivate:(id)sender {
switch1.on = YES;
}

我在Interface Builder中更改了连接,因此该按钮现在触发delayedActivate。它构建没有错误,但当我按下我的按钮时,我仍然可以立即激活。谁能看到我做错了什么?

谢谢,

Dessie。

4 个答案:

答案 0 :(得分:2)

我猜测虽然你说“我在Interface Builder中更改了连接”,但你没有 - 你仍然可以从按钮连接到immediateActivate。你也可以挂钩到delayedActivate,但它可以被挂钩到多个动作。要确认这一点,如果您不太了解如何在IB中使用连接检查器,最简单的方法就是为每个方法添加一个NSLog,以便您可以查看控制台以查看每个方法的调用时间。 - 嘿,在我打字的时候,别人给了同样的答案! :)

答案 1 :(得分:1)

听起来您可能已将按钮连接到这两个操作,请在Interface Builder中检查。右键单击该按钮,然后展开“操作”下的连接。

如果是这种情况,你会看到immediateActivate:先火,然后是delatedActivate:5秒后激活。您可以使用几个断点或NSLog(@"Here!");语句来检查这一点。

答案 2 :(得分:0)

通过调试器检查流量是什么意思-(IBAction)immediateActivate:(id)sender首先调用immediateActivateimmediateActivate首先调用。

希望你在IBConnection中失去作用。

答案 3 :(得分:0)

只是旁注,调试器中似乎存在错误。我正在使用Xcode 4.3,虽然这也发生在4.2.1上。如果您在performSelector:延迟调用后立即创建断点,即使应用程序在断点处暂停,也会测量延迟,如果在此暂停时间内达到延迟时间,则选择器将立即执行。但是,在正常的代码执行中,一切正常。