Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSTimer未调用方法_Ios_Objective C_Swift_Nstimer - Fatal编程技术网

Ios NSTimer未调用方法

Ios NSTimer未调用方法,ios,objective-c,swift,nstimer,Ios,Objective C,Swift,Nstimer,我有一个NSTimer,它应该每秒调用一个方法,但它似乎根本没有调用它 以下是我声明计时器的方式: [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES]; 这是它调用的方法: -(void) fadeManager: (NSTimer*) timer{ NSLog(@"IT'S WORKING!"); self.playH

我有一个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];
    }
}
-(无效)fadeManager:(NSTimer*)计时器{
NSLog(@“它正在工作!”);
self.playHead+=.1;//跟踪它们的完整位置
如果(self.playHead>=self.wait&![player isPlaying]){//检查等待是否结束
[玩家游戏];
}
如果(self.playHead>=self.duration+self.startTime&&[player isPlaying]){//检查完整持续时间是否结束
[玩家暂停];
[自复位];
}
int fadeOutArea=self.startTime+self.duration-self.fadeOut;
int fadeInArea=self.startTime+self.fadeIn;
如果(self.playHead=fadeOutArea&&[player volume]>0){
[自我消失犯罪];
}
}
代码不起作用,所以我把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
 .......
#导入
@接口提示音乐()
-(无效)延迟衰减:(AVAudioPlayer*)dFade;
-(无效)发案;
-(无效)渐弱犯罪;
-(void)fadeManager:(NSTimer*)计时器;// 任用

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


从文件中
  • 使用或类方法创建计时器,并在默认模式下在当前运行循环中安排它

  • 使用或类方法创建计时器对象,而无需在运行循环中对其进行调度。(创建计时器后,必须通过调用相应nsrunlop对象的addTimer:forMode:method手动将计时器添加到运行循环中。)


银行代码 或者

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


你需要启动计时器

您可以通过将其添加到线程来执行此操作:

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

[timer fire];
您可以使用:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

您的问题是,当使用
timerWithTimeInterval:target:selector:userInfo:repeats:
时,生成的计时器不会自动添加到运行循环中。我建议改用
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
,它为您执行此步骤

如果您喜欢使用
timerWithTimeInterval:target:selector:userInfo:repeats:
,则需要手动将计时器添加到当前运行循环中。为此,请调用
nsrunlop
addTimer:forMode:
方法


这甚至与Xcode.Ohhh没有任何关系。。。我一定是在xcode建议中选择了错误的方法。我本想给第二个打电话的。我也这么做了,我已经多次看到同样的问题。
[timer fire];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:tTimer forMode: NSDefaultRunLoopMode];