在iOS SDK中委派音频播放

时间:2013-01-10 08:28:12

标签: iphone objective-c ios6

我已经玩了几天iOS SDK了,现在我已经开始通过编写一个可以显示内容的小型应用程序来学习我所学到的概念和方法。目前在音乐库中播放的歌曲在我的iPhone上。

我遇到的问题是虽然AVAudioPlayerDelegate上有委托方法,当一段音频播放完毕时,我似乎无法找到任何被调用的通知/事件/委托方法的引用,并且可以当一段音频播放时 - 例如当用户按下播放按钮,或者甚至只是音轨改变时,它就会被连接/聆听。

经过整整3天(!!!)的iOS开发和玩游戏后,很明显会有办法实现,但我不知道在哪里找到它。除了在我的UI上有一个按钮,就像我现在一样填充信息(工作正常,后端代码完成它的意思),我能看到的另一种方法是挂钩'轨道完成对上述代表的'方法'并使用它。

但这看起来有点黑客。

已更新

嗯,我想我暂时完全迟迟了。这是您第一次使用Java背景来摆弄iOS时所获得的。我实现了你的建议(有一些句法调整)如下:

h file:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>

@protocol GeoTunesAVAudioPlayerDelegate <AVAudioPlayerDelegate>

-(void)didStartPlaying;

@end

@interface GeoTunesAVAudioPlayer : AVAudioPlayer <AVAudioPlayerDelegate>

@end

和m文件:

 #import "GeoTunesAVAudioPlayer.h"

@implementation GeoTunesAVAudioPlayer

- (id)init
{
    self = [super init];

    return self;
}

- (BOOL) play
{


    if ([[self delegate] respondsToSelector:@selector(didStartPlaying)])
    {
        [(id)[self delegate] didStartPlaying];
    }

    return [super play];

}


@end

我在我的控制器中实现了这个:

 // Set up the audio delegate
 player = [[GeoTunesAVAudioPlayer alloc] init];
 player.delegate = self;

但是这个小小的安排与EXC_BAD_ACCESS有关,这令人沮丧,因为我对这里幕后发生的事情不够了解甚至无法评估问题所在。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我觉得它不可用!这是一个想法:

  1. Subclass AVAudioPlayer
  2. 扩展协议
  3. 添加新的委托方法
  4. 覆盖play并实施委托方法并致电super
  5. 一般想法:(警告,语法可能有误!)

        // .h
    
        @protocol AVAudioPlayerSubDelegate <AVAudioPlayerDelegate>
           -(void)didStartPlaying;
        @end
    
        @interface AVAudioPlayerSub : AVAudioPlayer;
    
       // .m
    
        @implementation AVAudioPlayerSub
    
        - (void) play
    
           if ([delegate respondsToSelector:@selector(didStartPlaying)]){
              [(id)delegate didStartPlaying];
           }
    
           [super play];
    
        }
    

    评论后编辑:

    我认为你的AVAudioPlayer(GeoTunesAVAudioPlayer)类的子类不应该符合AVAudioPlayerDelegate,因为这是委托类。你应该让控制器包含符合你的子协议GeoTunesAVAudioPlayerDelegate的播放器对象

    //的.h

    #import <Foundation/Foundation.h>
    #import <AVFoundation/AVAudioPlayer.h>
    
    @protocol GeoTunesAVAudioPlayerDelegate <AVAudioPlayerDelegate>
    
    -(void)didStartPlaying;
    
    @end
    
    @interface GeoTunesAVAudioPlayer : AVAudioPlayer
    
    @end
    

    和m文件:

    #import "GeoTunesAVAudioPlayer.h"
    
    @implementation GeoTunesAVAudioPlayer
    
    - (id)init
    {
        self = [super init];
    
        return self;
    }
    
    - (BOOL) play
    {
        if ([[self delegate] respondsToSelector:@selector(didStartPlaying)])
        {
            [(id)[self delegate] didStartPlaying];
        }
    
        return [super play];
    
    }
    
    @end
    

    并在您的控制器中:

    //.h
    @interface MyViewController : UIViewController <GeoTunesAVAudioPlayerDelegate>
    
    //.m
    
    player = [[GeoTunesAVAudioPlayer alloc] init];
    player.delegate = self;