6

を使用してアプリの左下隅にタイマーを表示しようとしましたがNSTimer、「経過時間」を左下隅に表示するようにしましたが、うまくいきませUILabelんでした。

-(void)viewDidLoad
{
    NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}

-(void)aTime
{
    NSLog(@"....Update Function Called....");

    static int i = 1;

    Label.text = [NSString stringWithFormat:@"%d",i];

    i++;
}

タイマーは実際に機能しますが、ボタンでトリガーすることはできません。次のストーリーボード/xibファイルに入ったときに、タイマーを続行し、1で再起動しないようにしようとしています。

4

2 に答える 2

11

IBActionボタンを押したときにタイマー アクションを実装するには、次のようなメソッドに記述する必要があります。

- (IBAction) buttonPress
{
    NSTimer *aTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(aTime) userInfo:nil repeats:YES];
}

以前の値を保存するには、NSUserDefaultsまたは SQLite データベースを使用できます。この目的のために、私は提案しNSUserDefaultsます。

aTime メソッドを次のように変更します。

-(void)aTime
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
    id obj = [standardUserDefaults objectForKey:@"TimerValue"];
    int i = 0;

    if(obj != nil)
    {
        i = [obj intValue];
    }

    Label.text = [NSString stringWithFormat:@"%d",i];
    i++;

    [standardUserDefaults setObject:[NSNumber numberWithInt:i] forKey:@"TimerValue"];
    [standardUserDefaults synchronize];
}
于 2012-09-21T16:53:55.217 に答える
3

問題は、メソッド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];
}
于 2012-09-21T16:48:47.150 に答える