0

我想在一个方法中插入一个 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 图像更改,然后重新加载表格。我在想延迟会解决这个问题。

4

2 回答 2

1

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

改为使用performselector: withObject: afterDelay:

像这样的东西:

  [self performSelector:@selector(yourDelayedMethod) withObject:nil afterDelay:2];
于 2013-02-18T16:50:58.837 回答
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 效果之间的任意时间延迟对用户来说可能看起来很尴尬。

于 2013-02-18T17:44:24.230 回答