2013-08-02 2 views
-1

Приветствую меня, я новичок в разработке iOS. У меня есть одна проблема, связанная с NSTimer. Я использую NSTimer в своем контроллере.
Таймер начинает уменьшаться при событии UIButton. После вызова таймера, когда я перехожу к другому контроллеру представления. Затем таймер уменьшает значение, что он работает нормально. Но когда я вернусь к просмотру таймера, таймер перестанет обновлять значение, поэтому таймер не вызывает его @selector(). Как я могу вызвать метод обновления значения, когда вернусь к просмотру таймера?Метод NSTimer, не вызывающий значение значения

Мой код выглядит следующим образом:

-(IBAction)btnStrDecPressed:(id)sender 
{ 

    countDownlabel.text = [NSString stringWithFormat:@"%@:%@:%@", pickhour, pickmins, picksecs]; 
    secondsLeft=[pickhour intValue] * 3600; 
    secondsLeft=secondsLeft + [pickmins intValue] * 60; 
    secondsLeft=secondsLeft + [picksecs intValue]; 
    appdel.LeftSeconds=secondsLeft; 
    NSLog(@"%d",appdel.LeftSeconds); 


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

-(void)updateCountdown 
{ 
    int hours, minutes, seconds; 

    hours = appdel.LeftSeconds/3600; 
    minutes = (appdel.LeftSeconds % 3600)/60; 
    seconds = (appdel.LeftSeconds %3600) % 60; 
    appdel.LeftSeconds--; 
    countDownlabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; 

    if (appdel.LeftSeconds==0) 
    { 
     [[[UIAlertView alloc] initWithTitle:@"Restaurant" message:@"Timer Completed" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
     [timer invalidate]; 
    } 
} 

Где pickhour, pickmins, picksecs ценности, получая от UIPickerView.

+0

Покажите нам свой код в viewWillAppear viewWillDisapear методы, также покажите нам, как вы переходите к другому viewController – Ecarrion

+0

Я не добавляю метод viewWillAppear и viewDidAppear, у меня есть viewDidLoad. И у меня есть слайдер, как вид мастера-детали. Как и при щелчке мастера viewSelectRow, мы меняем информацию о подробном представлении. Здесь я нажимаю другой вид на щелчок мастер-представления didSelectRow. Я использую для этого образец кода. –

+0

Привет, ты уверен? вы btnStrDecPressed функция, вызывающая после нажатия кнопки ... если да, тогда проверьте управление enter, если (timer == nil) условие. потому что я думаю, ваш таймер не инициализируется. – Hindu

ответ

1

Используйте следующий код:

-(void)viewWillAppear:(BOOL)animated 
{ 
    timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES]; 
} 

-(void)updateCountdown 
{ 
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    int hours, minutes, seconds; 
    if([def valueForKey:@"time"] != nil) 
    { 
    countDownlabel.text = [def valueForKey:@"time"]; 
    NSArray *arr = [countDownlabel.text componentsSeparatedByString:@":"]; 
    hours = [arr objectAtIndex:0]; 
    minutes = [arr objectAtIndex:1]; 
    seconds = [arr objectAtIndex:2]; 
    appdel.LeftSeconds--; 
    } 
    else{ 
    hours = appdel.LeftSeconds/3600; 
    minutes = (appdel.LeftSeconds % 3600)/60; 
    seconds = (appdel.LeftSeconds %3600) % 60; 
    appdel.LeftSeconds--; 
    } 
    countDownlabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; 
    [def setValue:[NSString stringWithFormat:@"%@",countDownlabel.text] forKey:@"time"]; 
    if (appdel.LeftSeconds==0) 
    { 
     [[[UIAlertView alloc] initWithTitle:@"Restaurant" message:@"Timer Completed" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
     [timer invalidate]; 
    } 
} 

(Примечание: Используйте значение NSUserdefault для хранения времени и когда появится представление значения по умолчанию сохраняются бы неправдоподобным)

+0

каждый раз, когда он идет в if ([def valueForKey: @ "time"]! = Nil). В первый раз он принимает значение мусора и входит в это условие. –

+0

Удалите одно из условий: = nil, но сохраните его как [def valueForKey]. Но дело в том, что вы получите только время, если вы его сохраните. –

0

Таймер тикает все время, пока ваш [таймер недействителен], а не только когда вы увидите представление.

Причина, по которой вы не можете повторно инициализировать ее, заключается в том, что вы полностью не сбросите таймер. Попытайтесь:

[timer invalidate]; 
timer = nil; 
0

Проблема в том, что каждый раз, когда вы покидаете контроллер времени таймера и возвращаетесь, вы создаете его новый экземпляр. Вот почему таймер равен нулю каждый раз, и каждый раз, когда вы запускаете таймер, он уменьшается на 1 секунду.

Предлагаю вам переместить селектор и таймер updateCountdown в AppDelegate.

+0

Значит, я должен объявить оба этих метода в делетете делегата. –

+0

Переместите 'updateCountdown' и вместо проверки' if (timer == nil) 'do' if (appdel.timer == nil) '. – UpL1nK

+0

Это работало для вас? – UpL1nK