【发布时间】:2014-03-27 13:55:12
【问题描述】:
由于 Apple 鼓励使用积木,我想做一系列动画,它们之间有声音输出,基本上就像一个 todolist,我想用积木来实现这个。
不幸的是,AVAudiosplayer 似乎不像 UIAnimation 那样支持 onCompletion 块。
所以我认为将这种支持添加到 AVAudioplayer 会很酷。
所以我不知道这是什么
标题
#import <AVFoundation/AVFoundation.h>
@interface AVAudioPlayer (AVAudioPlayer_blockSupport)
typedef void(^AVPlaybackCompleteBlock)(void);
@property (nonatomic, copy) AVPlaybackCompleteBlock block;
-(id)initWithContentsOfURL:(NSURL*)pathURL error:(NSError**)error onCompletion:(AVPlaybackCompleteBlock) block;
-(void)setBlock:(AVPlaybackCompleteBlock)block;
-(AVPlaybackCompleteBlock)block;
-(void) executeBlock;
@end
和m文件
#import "AVAudioPlayer+blocks.h"
@implementation AVAudioPlayer (AVAudioPlayer_blockSupport)
-(id)initWithContentsOfURL:(NSURL *)pathURL error:(NSError **)error onCompletion:(AVPlaybackCompleteBlock )block {
self = [[AVAudioPlayer alloc] initWithContentsOfURL:pathURL error:error];
self.block = block;
return self;
}
-(void)setBlock:(AVPlaybackCompleteBlock)block {
self.block = block;
}
-(AVPlaybackCompleteBlock)block {
return self.block;
}
-(void) executeBlock {
if (self.block != NULL) {
self.block();
}
}
@end
这样做之后,我想我应该能够像这样创建一个新的音频播放器:
player = [[AVAudioPlayer alloc] initWithContentsOfURL:pathURL error:&error onCompletion:block];
这似乎有效。
现在在委托中将尝试执行附加的块。
if (localPlayer.block) {
[localPlayer executeBlock];
}
不幸的是,当我尝试运行代码时,它似乎在无限循环。我想用 synthesize 代替,但那不是用于类别的......
如果我不实现该方法,我会坚持使用'-[AVAudioPlayer setBlock:]: unrecognized selector sent to instance,这是有道理的,因为没有该名称的方法。
我发现了这个Block references as instance vars in Objective-C,所以我认为我应该能够将附加属性(我的块)附加到 AudioPlayer。
【问题讨论】:
标签: ios objective-c objective-c-blocks avaudioplayer