自定义Segue不播放声音

时间:2015-02-02 06:23:32

标签: objective-c audio segue

我制作了一个自定义的segue,我希望它在更改视图时播放声音。不幸的是,它没有。方法playSound在View Controller中使用时工作正常。但是我不想在我需要的每个View Controller中导出它。如何改进我的代码以及为什么segue不想播放声音?

#import "CustomSegue.h"
@import AVFoundation;

@interface CustomSegue()
@property (nonatomic, strong) AVAudioPlayer *player;
@end

@implementation CustomSegue
@synthesize player;
- (void) perform
{
    UIViewController *src = (UIViewController *) self.sourceViewController;
    UIViewController *dst = (UIViewController *) self.destinationViewController;

    [UIView transitionWithView:src.navigationController.view duration:0.5
                       options:UIViewAnimationOptionTransitionCrossDissolve
                    animations:^{
                        [src.navigationController pushViewController:dst animated:NO];
                    }
                    completion:NULL];
    [self playSound];
}

- (void) playSound
{
    int r = arc4random_uniform(7) + 1;

    NSURL *soundUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i", r] ofType:@"caf"]];
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];

    [self.player prepareToPlay];
    [self.player play];
}

1 个答案:

答案 0 :(得分:0)

我敢打赌你的自定义segue会在声音有机会播放之前释放(ARC),你的音频播放器随之释放。 The Life Cycle of a Segue是{{3}}执行-perform后立即解除分配的。

您需要做的是将音频播放器保持更长时间。一种方法是从一个不会被释放的对象中添加(强)引用AVAudioPlayer,至少只要声音播放。例如,将播放器放置在您的应用代理中,只要应用正在运行,该代理就会一直存在。

尝试将player属性和-playsound方法移动到您的应用代理中。该属性应该类似于:

@property (strong, nonatomic) AVAudioPlayer *player;

然后,在这个segue中,代替[self playsound];用以下内容调用app delegate:

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
[appDelegate playsound];