我制作了一个自定义的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];
}
答案 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];