从函数中获取局部变量,并在另一个可以动态更改的函数中实现该变量

时间:2011-04-24 14:06:33

标签: objective-c cocoa xcode macos nstimer

我的应用有一个函数,它从NSTextField获取一个值,然后声明变量,如下所示:

- (IBAction)startTimer

//all the other code

int totalTime = secs + hoursInSeconds + minutesInSeconds

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

然后,我想在另一个处理totalTime的函数中使用局部变量NSTimer

- (void)timerHandler

//all other code

totalTime =  totalTime - 1;   

//invalidate timer when it reaches 0
if (totalTime == 0.0) {
    [timer invalidate];

但是,由于变量totalTime是一个局部变量,我无法使用该值,并且我无法移动代码,因为NSTimer每1秒调用一次,并且用户可能会更改变量(从而重新声明它)。 / p>

所以,有什么方法可以从函数中获取局部变量并在另一个可以动态更改的函数中实现变量?或者我可以通过使用一个函数来实现NSTimer倒计时

2 个答案:

答案 0 :(得分:1)

您可以将值包装在计时器的userInfo

NSNumber *totalTimeNumber = [NSNumber numberWithInt:totalTime];
timer = [NSTimer scheduledTimerWithTimeInterval:... target:... selector:... userInfo:totalTimeNumber repeats:...];

或者只是将它变为实例变量。

答案 1 :(得分:0)

嗯,这是一个有趣的方法,可以使用局部变量,而不是实例变量,但只适用于Mac OS 10.6 / iOS 4及更高版本:

-(IBAction)startTimer:(id)sender
{
    // ensure, that the variables we'll capture in the block are mutable
    __block int totalTime = ...
    __block NSTimer *timer;
    void (^timerBlock)() = ^{
        if (--totalTime <= 0) { // this comparison is much less fragile...
            [timer invalidate];
        }
    };
    // If you'd call timerBlock() at this point you'll crash because timer contains junk!
    // However, (since timer is declared as __block) we can give it a meaningful value now and have it updated inside of the block, as well:
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerHandler:) userInfo:timerBlock repeats:YES];
}

-(void)timerHandler:(NSTimer*)timer
{
   ((void (^)())[timer userInfo])(); // retrieve the block and run it
}

警告:
由于我是通过手机发送的,因此我对timerHandler:中的演员阵容并不是100%肯定。但这是沿着这条路走的......  你应该能够完全省略演员阵容,但肯定会看到警告。