1

私は過去数時間からこの問題を抱えていて、できる限りの検索を行いましたが、残念ながら、私の問題を解決するものは何も見つかりませんでした.... TimerViewController のラベルを更新することになっている AppDelegate で...ラベルのセッターに従って、値を正しく取得しており、NSLog に表示されていますが、ラベルが画面上で更新されていません...このセッターは AppDelegate から呼び出されています毎秒、ラベルはタイマーを表示することになっています。

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

ラベルを再確認しました。インターフェイスに正しく接続されています。ViewDidLoad からラベルをテスト文字列で更新しようとしましたが、ラベルに文字列が表示されていました...助けてください!

編集: 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];
    .......
}
4

2 に答える 2

1

jabobadillaによる以下のコードに従って、この問題を解決しました

ビューを離れて戻ってくると、NSTimerを起動するメソッドがメインスレッドになくなるため、AppDelegateでNSTimerが更新している値を取得するメソッドを実行することで実際に解決しました。このメソッドは、NSTimer が有効である限りループします。また、遅延を設定して、UI が値を更新できるようにしてから、メソッドを再度実行できるようにしました。同様の問題が発生した場合に役立つコードを次に示します。このアイデアは、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];
    } 

}
于 2013-05-16T08:23:58.900 に答える
0

There may be problem in your IBOutlet....

Try to create a programatic UILabel and pass the _mainTimerLabel value to that label....

This may help you..

于 2013-05-15T03:20:53.180 に答える