1

我需要创建一个新的 NSNumber 或整数属性,称为primaryKey包含在我创建的所有AVAudioPlayer对象中,以便我可以在audioPlayerDidFinishPlaying回调中读取该属性的值并确切知道播放了哪个数据库记录。

我需要这样做的原因是:我不能使用播放器URL 属性来确定它是哪个数据库记录,因为可以在播放列表中多次使用同一个声音文件。

如何向这样的现有 iOS 类添加新属性?


例子:

AVAudioPlayer *newAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];  

self.theAudio = newAudio; // automatically retain audio and dealloc old file if new file is loaded
if (theAudio != nil) [audioPlayers addObject:theAudio];

[newAudio release];

[theAudio setDelegate: theDelegate];
[theAudio setNumberOfLoops: 0];
[theAudio setVolume: callVolume];

// This is the new property that I want to add
[theAudio setPrimaryKey: thePrimaryKey];

[theAudio play];

然后我会像这样在回调中检索它:

- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{    
   NSNumber *finishedSound = [NSNumber numberWithInt:[player primaryKey]];

   // Do something with this information now...
}
4

2 回答 2

4

您可以创建一个子类并添加您的属性,就像对任何东西进行子类化一样。

界面

@interface MyAudioPlayer : AVAudioPlayer

@property (nonatomic) int primaryKey;

@end

执行

@implementation MyAudioPlayer

@synthesize primaryKey = _primaryKey;

@end

创造

MyAudioPlayer *player = [[MyAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
player.primaryKey = thePrimaryKey;
...

代表

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    if ([player isKindOfClass:[MyAudioPlayer class]]) {
        MyAudioPlayer *myPlayer = (MyAudioPlayer *)player;
        NSNumber *primaryKeyObject = [NSNumber numberWithInt:myPlayer.primaryKey];
        ...
    }
}
于 2012-06-08T23:00:22.397 回答
1

一种简单的方法可能是创建一个 NSMutableDictionary 并使用您创建的 AVAudioPlayers 作为 KEYS,并将主键(或整个字典)作为相应的 VALUE。然后,当玩家停止播放(或错误)时,您可以在字典中查找并恢复您喜欢的任何内容。

于 2012-06-08T22:58:02.697 回答