AVAudioPlayer在单元格中,如何不释放?

时间:2014-05-25 22:11:37

标签: objective-c memory avaudioplayer

我有一个自定义单元格类的集合视图。

在每个单元格中,我都有一个具有特定声音的玩家。 当制作一个Button并使用IBOutlet链接到我的代码时,即使我在所有视图中都有userInteractionEnabled = YES这个事实,它也不会触发。

所以我决定在集合视图控制器中播放声音。 在我的手机中,玩家有一个属性

@property (strong, nonatomic) AVAudioPlayer *voicePlayer;

然后在我的收藏中:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    LHFriendVoiceCollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"LHFriendVoiceCollectionViewCell" forIndexPath:indexPath];
    LHFriendVoiceObject *currentFriendVoice = [[LHFriendVoiceObject alloc] initWithNSDictionnary:[self.friendsArray objectAtIndex:indexPath.row]];
    [cell hydrateWithFriendVoiceObject:currentFriendVoice];
    [cell.voicePlayer prepareToPlay];
    //[self.voicesArray addObject:cell.voicePlayer]; tried to stock them in array but doesn't work
    return cell;
}

如果我用这种方法播放声音它可以正常工作,但我希望在选择单元格时播放声音。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:  (NSIndexPath *)indexPath {
   LHFriendVoiceCollectionViewCell *cell = 
       [self.collectionView dequeueReusableCellWithReuseIdentifier:@"LHFriendVoiceCollectionViewCell" forIndexPath:indexPath];
   [cell.voicePlayer play];
}

这里声音没有播放,因为voicePlayer是零。 我如何能保住我的球员?

1 个答案:

答案 0 :(得分:0)

这段代码就是问题:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:  (NSIndexPath *)indexPath {
   LHFriendVoiceCollectionViewCell *cell = 
       [self.collectionView dequeueReusableCellWithReuseIdentifier:@"LHFriendVoiceCollectionViewCell" forIndexPath:indexPath];
   [cell.voicePlayer play];
}

第一行错了。您正在呼叫dequeue。大错!它创造了一个全新的细胞。不要制作这样的新电池!显然,新单元格中不会包含任何AVAudioPlayer。

你已经有一个细胞;它刚被选中。使用indexPathcellForItemAtIndexPath:了解选择了哪个单元格。那是你想谈的那个。

PS你真的应该弄清楚为什么按钮方法不起作用,但此时没什么大不了的。