2011-04-24 4 views
0

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

ответ

1

Вы можете обернуть значение в таймера userInfo:

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

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

+0

Вы любезно разработали бы? –

+2

Я отредактировал свой ответ. Но поскольку теперь я вижу, что вы действительно хотите изменить число позже, это не является жизнеспособным вариантом. Поэтому вы должны просто сделать это иваром. –

+0

так как я могу сделать его переменной экземпляра? –

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 
} 

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

Смежные вопросы