你能看到这段代码有什么问题吗?

时间:2010-02-08 16:24:38

标签: iphone objective-c xcode

NSString *path = [[NSBundle mainBundle] pathForResource:[arraySub objectAtIndex:indexPathHere.row] ofType:@"mp3"];
NSURL *file = [[NSURL alloc] initFileURLWithPath:path];
AVAudioPlayer *myPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil];
self.player = myPlayer;
[player prepareToPlay];
[player setDelegate:self];
[self.player play];

NSTimeInterval lenghtMusic = player.duration;

if (player.currentTime == lenghtMusic) {
 NSLog(@"It worked");
 [tableThing deselectRowAtIndexPath:indexPathHere animated:YES];
 [myPlayer autorelease];
 [file autorelease];
}

你能看到什么问题吗?

显然,“if” - 陈述从未被称为......

3 个答案:

答案 0 :(得分:17)

如果我正确阅读了您的代码,您正试图了解播放器何时播放完毕,然后您想要取消选择当前的代码并释放播放器。 您的问题是您启动播放器然后立即检查它当前正在播放的位置。除非你的文件长度接近0,否则currentTime和length永远不会相等。

如果您正在尝试这样做,则应使用AVAudioPlayerDelegate Protocol,尤其是:

– audioPlayerDidFinishPlaying:successfully:

玩家完成时调用的方法。

因此,您需要通过编辑.h文件来更改控制播放器的类,以使用AVAudioPlayerDelegate协议。显然,不管你以前做过什么。

@interface YourClass <AVAudioPlayerDelegate>

@end

在您的.m文件中: 然后,当您创建并分配了播放器实例时:

[player setDelegate:self];

在.m文件中还添加方法

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    // Your success code goes here
}

答案 1 :(得分:3)

您正在将double==进行比较,由于四舍五入错误,这几乎总是假的。

与范围比较,例如

if (fabs(player.currentTime - lenghtMusic) < 0.0001) {
  ...
}

答案 2 :(得分:0)

我是一个noob iPhone开发者,但你确定player.currentTime是一个NSTimeInterval吗?这看起来是最明显的候选人。

另外,我会在你的if之前注明你的player.currentTime是什么以及lenghtMusic是什么,那可能会让你知道发生了什么。