10

毎秒メソッドを呼び出す必要がある NSTimer がありますが、まったく呼び出していないようです。

これは私がタイマーを宣言する方法です:

[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];

これが呼び出すメソッドです。

-(void) fadeManager: (NSTimer*) timer{
    NSLog(@"IT'S WORKING!");
    self.playHead += .1; // keeps track of where they are in full track
    if (self.playHead >= self.wait  && ![player isPlaying]) { // checks if wait is over
        [player play];
    }
    if (self.playHead >= self.duration + self.startTime && [player isPlaying]) { // checks if full duration is over
        [player pause];
        [self reset];
    }
    int fadeOutArea = self.startTime + self.duration - self.fadeOut;
    int fadeInArea = self.startTime + self.fadeIn;
    if (self.playHead <= fadeInArea && [player volume] < relativeVolume) { // checks if fadingIn.
        [self fadeInIncriment];
    }
    if (self.playHead >= fadeOutArea  && [player volume] > 0) {
        [self fadeOutIncriment];
    }
}

コードが機能していなかったので、NSLog とブレーク ポイントを入れました。呼び出されることはないようです。どうしてこれなの?次のように .m ファイルでメソッドを宣言したことは重要ですか。

#import <AVFoundation/AVFoundation.h>
@interface CueMusic ()

- (void) delayFadeOut: (AVAudioPlayer*) dFade;
- (void) fadeInIncriment;
- (void) fadeOutIncriment;
- (void) fadeManager: (NSTimer*) timer; // <--------
- (void) start;

@end

@implementation CueMusic
 .......
4

4 に答える 4

23

どちらかを使用

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

また

//schedules the timer
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];

docs Scheduling Timers in Run Loopsから


スウィフトコード

また

let timer: NSTimer = NSTimer(timeInterval: 1.0, target: self, selector: "fadeManager:", userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)

または

//schedules the timer
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "fadeManager:", userInfo: nil, repeats: true)
于 2013-03-20T16:41:45.623 に答える
6

あなたの問題は、 を使用するtimerWithTimeInterval:target:selector:userInfo:repeats:と、結果のタイマーが実行ループに自動的に追加されないことです。scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:代わりに、この手順を実行するを使用することをお勧めします。

使用timerWithTimeInterval:target:selector:userInfo:repeats:したい場合は、タイマーを現在の実行ループに手動で追加する必要があります。これを行うには、NSRunLoopaddTimer:forMode:メソッドを呼び出します。ドキュメンテーション

[[NSRunLoop currentRunLoop] addTimer:tTimer forMode: NSDefaultRunLoopMode];
于 2013-03-20T16:44:36.483 に答える
2

タイマーを起動する必要があります。

スレッドに追加することでそれを行うことができます:

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

または呼び出し

[timer fire];
于 2013-03-20T16:44:27.370 に答える
1

以下を使用できます。

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
于 2013-03-20T16:44:35.610 に答える