問題は、メソッドaTime
がビューコントローラにあることだと思います。別のビューに入ると、このビューコントローラが解放され、セレクタaTimeを実行できなくなります。
したがって、aTime
メソッドとi
シングルトン(または別のビューに入ったときに解放されないオブジェクト)に配置し、シングルトンをタイマーのターゲットとして設定することをお勧めします。
また、このビューに戻ったときにラベルを適切に更新できるように、ViewControllerに以下のコードを保持する必要があります。
-(void)viewDidLoad
{
NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}
-(void)aTime
{
NSLog(@"....Update Function Called....");
Label.text = [NSString stringWithFormat:@"%d",theSingleton.i];
}
より良い選択:
シングルトンのプロパティとしてiを宣言し、オブザーバーをiに追加すると、ラベルが時間どおりに更新されます。時間をカウントしたい場合は-startTimerを呼び出します。
シングルトン:
@interface Singleton
@property (nonatomic,retain) NSNumber *i;
@end
@implementation
+(Singleton*)instance
{
//the singleton code here
}
-(void)startTimer
{
NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}
-(void)aTime
{
NSInteger temp = [i integerValue];
temp ++;
self.i = [NSNumber numberWithInteger:temp];
}
ビューコントローラ:
-(void)viewDidLoad
{
[super viewDidLoad];
[[Singleton instance] addObserver:self forKeyPath:@"i" options:NSKeyValueObservingOptionNew context:NULL]];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
NSLog(@"....Update Function Called....");
Label.text = [NSString stringWithFormat:@"%@",[Singleton instance].i];
}