如何在方法中插入NSTimer?

时间:2013-02-18 16:44:33

标签: iphone ios objective-c nstimer

我想在方法中插入NSTimer延迟,并想知道如何去做。我已经加粗了我想放置延迟计时器的地方。

到目前为止,这是我的代码:

- (void) buttonPressed:(UIButton*) sender {

for(int i = 0;i < [categoryBtnImages count]; i++)
{
    UIButton *but = (UIButton *)[catButtonArray objectAtIndex:i];
    if(but != sender)
    {
        [but setImage:[UIImage imageNamed:[categoryBtnImages objectAtIndex:i]] forState:UIControlStateNormal];
       // but.selected = !but.selected;

    }
}

buttonCat = (UIButton *)sender;
int tagOfButton = buttonCat.tag - 2;

if (tagOfButton == -2 ){
    tagOfButton = 8;
}
[buttonCat setImage:[UIImage imageNamed:[categoryBtnImagesSel objectAtIndex:tagOfButton]] forState:UIControlStateNormal];

我想把延迟放在这里然后运行剩下的代码,但所有这些都来自此方法。

if ([sender.titleLabel.text isEqualToString:@"Button 0"]) {
    [self foodCatSort:nil];
    [self.tableView reloadData];


}
if ([sender.titleLabel.text isEqualToString:@"Button 1"]) {
    [self healthCatSort:nil];
    [self.tableView reloadData];

}
if ([sender.titleLabel.text isEqualToString:@"Button 2"]) {
    [self shoppingCatSort:nil];
    [self.tableView reloadData];

}

}

因为我想这样做的原因是因为按下按钮会重新加载表格并且按钮状态图像会发生变化。我希望用户首先看到uibutton图像更改然后重新加载表。我在想延迟会解决这个问题。

3 个答案:

答案 0 :(得分:1)

如果您只是需要延迟,则不需要NSTimer

请改用performselector: withObject: afterDelay:。这样的事情:

  [self performSelector:@selector(yourDelayedMethod) withObject:nil afterDelay:2];

答案 1 :(得分:1)

我认为你坚持将两半作为同一方法的一部分的原因是局部变量访问。事实上这是可能的,而不是NSTimer。要将要延迟的代码完全保留在与原始方法相同的范围内,可以使用dispatch_after()

[buttonCat setImage:[UIImage imageNamed:[categoryBtnImagesSel objectAtIndex:tagOfButton]] forState:UIControlStateNormal];

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.75 * NSEC_PER_SEC));
dispatch_after(delay, dispatch_get_main_queue(), ^(void){

    if ([sender.titleLabel.text isEqualToString:@"Button 0"]) {
        [self foodCatSort:nil];
        [self.tableView reloadData];
    }
    if ([sender.titleLabel.text isEqualToString:@"Button 1"]) {
        [self healthCatSort:nil];
        [self.tableView reloadData];

    }
    if ([sender.titleLabel.text isEqualToString:@"Button 2"]) {
        [self shoppingCatSort:nil];
        [self.tableView reloadData];

    }
});

你也应该考虑使用某种动画,因为UI效果之间的任意时间延迟对用户来说可能看起来很尴尬。

答案 2 :(得分:-5)

您可以使用sleep添加延迟:

sleep(delta);

delta是您想要添加的时间延迟。