Kyle Greenlaw
Kyle Greenlaw

Reputation: 737

How to make a button appear and disappear throughout a timer

I have this app which has a timer in it and I want to be able to display a button at random points in that timer. Sort Of like a game setting where you have to get the button to get more time before it disappears. I already have some code , but the problem is that the timer that i already have is being messed up ( i can tell because it is linked to a label. It messed up because it goes down by 2 instead of 1 and this only happens when i have the code to make the button appear and disappear with the timer.

Here is the code to my timer that is being messed up:

-(IBAction)Ready:(id)sender {

    [self performSelector:@selector(TimerDelay) withObject:nil afterDelay:1.0];
    [self performSelector:@selector(randomTimer) withObject:nil afterDelay:0.5];


}

-(void)TimerDelay {

    MainInt = 36;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                             target:self
                                           selector:@selector(countDownDuration)
                                           userInfo:nil
                                            repeats:YES];
}

Here is the code to the button:

    -(IBAction)Ready:(id)sender { //the same ready action as above

        [self performSelector:@selector(TimerDelay) withObject:nil afterDelay:1.0];
        [self performSelector:@selector(randomTimer) withObject:nil afterDelay:0.5];


    }

-(void)TimerDelay {

    MainInt = 36;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                             target:self
                                           selector:@selector(countDownDuration)
                                           userInfo:nil
                                            repeats:YES];
}

- (void)randomTimer {

    NSInteger randomTime = arc4random_uniform(0); //Some number between 0 and 9

    timer = [NSTimer scheduledTimerWithTimeInterval:randomTime
                                                  target:self
                                                selector:@selector(showButton)
                                                userInfo:nil
                                                 repeats:NO];
}


- (void)showButton {

    if(self.plus5.hidden == YES) {

        self.plus5.hidden = NO;
    }
    else {

        self.plus5.hidden = YES;
    }

    [self TimerDelay]; //Call random timer function again to run this method at a future random time
}

Upvotes: 0

Views: 361

Answers (2)

Giuseppe Garassino
Giuseppe Garassino

Reputation: 2292

You are calling "randomTimer" and "TimerDelay" (this should be "timerDelay") one after the other and scheduling and REscheduling "timer".

I think you should reconsider your architecture, here...

EDIT: Use just one timer and let it manage your button.

- (void)somewhereInYourCode
{
    shouldShowButton = YES;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                             target:self
                                           selector:@selector(timeFired)
                                           userInfo:nil
                                            repeats:YES];
}

- (void)timeFired
{
    // Here your countdown and...

    if (shouldShowButton) {
        NSInteger randomTimeInt = arc4random_uniform(9); // as suggested by Bergasms

        float randomTimeFloat = randomTimeInt;

        [self performSelector:@selector(showButton) withObject:nil afterDelay:randomTimeFloat];

        shouldShowButton = NO;
    }
}

This way your timer won't (probably) mess up.

Upvotes: 2

Bergasms
Bergasms

Reputation: 2203

This:

    arc4random_uniform() will return a uniformly distributed random number
 less than upper_bound.

is one of your problems.

NSInteger randomTime = arc4random_uniform(0); //Some number between 0 and 9    

needs to be

NSInteger randomTime = arc4random_uniform(9); //Some number between 0 and 9

I cannot say for the rest of your code. But the line you have will always return 0, which means the random timer will always execute instantly.

Upvotes: 1

Related Questions