sin*_*inθ 9 objective-c nstimer ios swift
我有一个NSTimer应该每秒调用一个方法,但它似乎根本没有调用它.
这就是我声明计时器的方式:
[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)
这是它调用的方法:
-(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];
}
}
Run Code Online (Sandbox Code Playgroud)
代码没有工作,所以我把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
.......
Run Code Online (Sandbox Code Playgroud)
Ind*_*ore 21
要么使用
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
要么
//schedules the timer
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)
使用
scheduledTimerWithTimeInterval:invocation:repeats:orscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:class方法创建计时器并在默认模式下在当前运行循环上计划它.使用
timerWithTimeInterval:invocation:repeats:ortimerWithTimeInterval:target:selector:userInfo:repeats:class方法创建计时器对象,而不在运行循环上计划它.(创建它之后,必须通过调用相应NSRunLoop对象的addTimer:forMode:方法手动将计时器添加到运行循环中.)
或
let timer: NSTimer = NSTimer(timeInterval: 1.0, target: self, selector: "fadeManager:", userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
Run Code Online (Sandbox Code Playgroud)
要么
//schedules the timer
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "fadeManager:", userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
您的问题是,在使用时timerWithTimeInterval:target:selector:userInfo:repeats:,生成的计时器不会自动添加到运行循环中.我建议scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:改为使用,它会为您执行此步骤.
如果您更喜欢使用,timerWithTimeInterval:target:selector:userInfo:repeats:则需要手动将计时器添加到当前运行循环中.要做到这一点,调用NSRunLoop的addTimer:forMode:方法.文档
[[NSRunLoop currentRunLoop] addTimer:tTimer forMode: NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7185 次 |
| 最近记录: |