web-dev-qa-db-ja.com

NSTimerを停止する方法

ちょっと私はサンプルアプリケーションを作成しているだけで、少し問題があります。そのため、テーブルビューがあり、その後数行あります。ユーザーが行をクリックすると、新しいビューに移動します。このビューには、音楽を再生するボタンがあります。タイマーを使用して、音楽の長さと残り時間に基づいてスライダーバーを増やしています。

今、私の問題は、左上のボタンを使用してテーブルビューに戻るときにNSTimerが停止するように、何を置く必要がありますか?

これは私がこれまでのところ持っているものです、私は繰り返しを得ることができません:停止するYESタイマー。

#import "SecondViewController.h"

@implementation SecondViewController
@synthesize lbl1;
@synthesize timer;

-(IBAction) slide {
 myMusic.currentTime = slider.value;
}

-(IBAction)play
{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
 slider.maximumValue = [myMusic duration];
 myMusic.volume = 0.2;
 [myMusic prepareToPlay];
 [myMusic play];
}

-(IBAction)pause
{
 [myMusic pause];
}

-(IBAction)stop
{
 slider.value = 0;
 myMusic.currentTime = 0;
 [myMusic stop];
}

- (void)updateTime{
  slider.value = myMusic.currentTime;
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

  //This plays music, we must give it a path to find the file and then u can change it. 
 NSString * pathToMusicFile = [[NSBundle mainBundle] pathForResource:@"Katy" ofType:@"mp3"];
     myMusic = [[ AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile] error:NULL];
     myMusic.delegate = self;
     myMusic.numberOfLoops = -1;

 slider.value = 0;
 //[myMusic play];

    [super viewDidLoad];
}


- (void)viewDidUnload {

 [timer invalidate];
 timer = nil;
 //myMusic.currentTime = 0;
 [myMusic stop];
 [super viewDidUnload];

 // Release any retained subviews of the main view.
 // e.g. self.myOutlet = nil;
}

-(IBAction) TxtChange;{

 lbl1.text = @" test2! I CHNAGED TEXT FROM ANOTHER XIB";
}

- (void)dealloc {
 [timer invalidate];
 timer = nil; 
 [myMusic release];
    [super dealloc];
}

@end
32
cruisx

以下のコードを使用してください。動作しますが、タイマーが実行モードの場合にのみ呼び出す必要があることに注意してください。そうしないと、アプリケーションがクラッシュします。

- (void)viewWillDisappear:(BOOL)animated {
    //BEFORE DOING SO CHECK THAT TIMER MUST NOT BE ALREADY INVALIDATED
    //Always nil your timer after invalidating so that 
    //it does not cause crash due to duplicate invalidate
       if(timer)
       {
         [timer invalidate];
         timer = nil;
       }
    [super viewWillDisappear:animated];
}
67
Suresh Varma

このような:

[yourtimername invalidate];

ただし、タイマーが既に停止している場合は、アプリがクラッシュするため停止できないことに注意してください。

13
DailyDoggy

ICoderによると、viewWillDisappearで無効にする必要があります。

念のため、以下を追加しました。わたしにはできる。それが役立つことを願っています(そして、コーダーに追加する答えはコピーするつもりはありません)

- (void) startTimer
{
[self stopTimer];
timer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                                     target: self
                                                   selector:@selector(onTick)
                                                   userInfo: nil repeats:YES];

}

- (void) stopTimer
{
    if (timer) {
        [timer invalidate];
        timer = nil;
    }

}
8
craigk

4年前の投稿は知っていますが、NSTimerを無効にしようとして時間を浪費することからNEXTを節約できるかもしれません。アップルのドキュメントで説明されており、私にとってはうまくいきます。

.hで

@property(nonatomic, retain) NSTimer *yourTimer;
@property(weak) NSTimer *repeatingTimer;

.mで

@synthesize yourTimer, repeatingTimer;

viewDidLoadで

yourTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimerInterval)(40.0/60.0)
                                             target:self
                                           selector:@selector(blink)
                                           userInfo:nil
                                            repeats:TRUE];

  self.repeatingTimer = yourTimer;

私の見解では

   [repeatingTimer invalidate];
   repeatingTimer = nil;

トリックは、最初のNSTimerを(弱い)NStimerオブジェクトに割り当て、THATオブジェクトを殺すことです。

6
user1045302

2つの異なるものを使用できます

    [timername invalidate];

または使用できます

    timername = nil;
2
VortexGamez

トリックは、シングルトンクラス、主にシングルトンとして使用されるgoogle myGlobalsクラスを使用することです。ただし、NSTimerを使用する場合は、

ビュー1はあなたが行くものであり、ビュー2はあなたが戻るものであると言うことができます2。

したがって、ビュー2の場合、NSTimerを記述して、viewDidLoadのタイマーを無効にします(両方のビューに2つの別個のクラスがあると仮定します)。問題は、ビュー1に移動すると発生しますビュー2タイマーは割り当て解除されます。したがって、Singletonクラスを作成し、NSTimerポインターを次のように保存します

//to be done in viewDidLoad function
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
[globals.myTimer invalidate];


//to be done in viewDidUnload
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
globals.myTimer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                                 target: self
                                               selector:@selector(onTick)
                                               userInfo: nil repeats:YES];

ああ、これがuが必要とするmyGlobalsクラスコードです

//theglobals.h file

#import <Foundation/Foundation.h>


@interface theGlobals : NSObject 
{
    NSTimer *myTimer;
}

@property (nonatomic, copy) NSString *changeyes;



+(theGlobals*)sharedInstance;
@end

//implementaton .m file

#import "theGlobals.h"
@implementation theGlobals

@synthesize myTimer;



static theGlobals *sharedInstance;

- (id) init
{
return self;
}

+(theGlobals*)sharedInstance
{
if (!sharedInstance)
{
    sharedInstance = [[theGlobals alloc] init];
}
return sharedInstance;
}
@end
1
Izac Mac

タイマーを無効にするだけです

[タイマー無効化];

0
Raza.najam