Получить локальную переменную из функции и внедрить переменную в другую функцию, которую можно динамически изменять - PullRequest
0 голосов
/ 24 апреля 2011

мое приложение имеет функцию, оно получает значение из 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 секунду и какпользователь может изменить переменную (и, следовательно, изменить ее).

Итак, есть ли способ получить локальную переменную из функции и реализовать переменную в другой функции, которую можно динамически изменять?или я могу реализовать обратный отсчет NSTimer, просто используя одну функцию

Ответы [ 2 ]

1 голос
/ 24 апреля 2011

Вы можете заключить значение в таймер userInfo:

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

Или просто сделайте его переменной экземпляра.

0 голосов
/ 25 апреля 2011

Хорошо, вот забавный, который работает с локальными переменными, а не с переменными экземпляра, но только в 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
}

Предупреждение:
Поскольку я отправляюэто с моего телефона, я не уверен на 100% о приведении в timerHandler:.Но это что-то в этом роде ... Вы должны быть в состоянии полностью исключить приведение, но тогда обязательно увидите предупреждение.

...