2013-05-15 4 views
0

У меня была эта проблема за последние пару часов и я сделал все, что мог, но, к сожалению, я не нашел ничего, что разрешило мою проблему .... Сценарий: у меня есть CountDownTimer в TimerViewController , NSTimer и другие методы настроены в AppDelegate, который, как предполагается, обновляет Label TimerViewController ... в соответствии с установщиком метки, я получаю значение правильно и его показ в NSLog HOWEVER, метка не обновляется на экране. . этот сеттер вызывается из AppDelegate каждый второй и этикетки, предполагают, чтобы показать таймер,обновление UILabel от appDelegate

- (void)setMainTimerLabel:(UILabel *)mainTimerLabel 
    { 
    _mainTimerLabel = mainTimerLabel; 
    NSLog(@"ValueUpdated %@",_mainTimerLabel); 
    } 

Я проверил ярлык, он соединился с интерфейсом кор прямо, я попытался обновить метку из ViewDidLoad с помощью тестовой строки, ярлык показывал мне строку ... Помогите пожалуйста!

EDIT: AppDelegate Код:

AppDelegate.h

@property (nonatomic, strong) TimerViewController *TimerVC; 

- (void)fireTimer; 

AppDelegate.m

- (void)fireTimer 
{ 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDownTimer) userInfo:nil repeats:YES]; 
} 

- (void) countDownTimer 
{ 
    ....... 
    TimerVC = [[TimerViewController alloc]init]; 
    self.TimerVC.mainTimerLabel = [NSString stringWithFormat:@"%02d:%02d:%02d",hours,minutes,seconds]; 
    ....... 
} 

ответ

1

Я решил эту проблему, используя приведенный ниже код по jabobadilla

я на самом деле решил ее выполнения способа, который будет идти и получить значение, которое NSTimer обновляет в моем AppDelegate, поскольку метод, запускающий NSTimer, больше не находится в основном потоке, когда я покидаю представление и возвращаюсь к нему. Этот метод будет зацикливаться до тех пор, пока мой NSTimer действителен. Я также установил задержку, позволяя пользовательскому интерфейсу обновить значение, а затем снова выполнить этот метод. Вот код, если он помогает кому-то столкнуться с подобной проблемой. Я получил эту идею из предложения, предоставленного chandan, спасибо!

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate> { 

} 

@property (nonatomic, retain) NSTimer *countdownTimer; 
@property (nonatomic, retain) NSString *timeString; 

CountdownTimerViewController.h

@interface CountdownTimerViewController : UIViewController { 

AppDelegate *appdelegate; 

} 

@property (strong, nonatomic) IBOutlet UILabel *labelCountdownTimer; 

@property (strong, nonatomic) IBOutlet UIButton *buttonStartTimer; 
@property (strong, nonatomic) IBOutlet UIButton *buttonStopTimer; 

- (IBAction)startTimer:(id)sender; 
- (IBAction)stopTimer:(id)sender; 

CountdownTimerViewController.m

@implementation CountdownTimerViewController 

@synthesize labelCountdownTimer; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
     // Do any additional setup after loading the view. 

    //Instatiating Appdelegate 
    if(!appdelegate) 
     appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

} 

- (void) viewDidAppear:(BOOL)animated { 

    if ([appdelegate.countdownTimer isValid]) { 
     [self updateLabel]; 
    } else { 
     labelCountdownTimer.text = @"00:00:00"; 
    } 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Button Action Methods 

- (IBAction)startTimer:(id)sender { 

    [self updateCounter]; 

} 

- (IBAction)stopTimer:(id)sender { 

    [appdelegate.countdownTimer invalidate]; 
    labelCountdownTimer.text = @"00:00:00"; 

} 

int countLimit=30; //seconds 
NSDate *startDate; 

- (void)updateCounter { 

    labelCountdownTimer.text = @"00:00:00"; 
    startDate = [NSDate date]; 

    appdelegate.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 
                    target:self 
                   selector:@selector(countDown) 
                   userInfo:nil 
                   repeats:YES]; 

} 

    - (void)countDown { 

    if([[NSDate date] timeIntervalSinceDate:startDate] >= countLimit) { 
     [appdelegate.countdownTimer invalidate]; 
     return; 
    } 
    else {    
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = -([currentDate timeIntervalSinceDate:startDate]); 
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"mm:ss"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 
    appdelegate.timeString = [dateFormatter stringFromDate:timerDate]; 
    labelCountdownTimer.text = appdelegate.timeString; 
    } 

} 


- (void) updateLabel { 

    if ([appdelegate.countdownTimer isValid]) { 
     labelCountdownTimer.text = appdelegate.timeString; 
     [self performSelector:@selector(updateLabel) withObject:nil afterDelay:0.05]; 
    } 

} 
0

Там может быть проблема в вашем IBOutlet ....

Try для создания программной UILabel и передачи _mainTimerLabel v ALUE на эту метку ....

Это может помочь вам ..

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