1

我已经在 iOS SDK 上玩了几天了,现在我开始通过编写一个显示当前正在播放的歌曲的点头小应用程序来介绍我学到的概念和方法来自音乐库的音乐在我的 iPhone 上。

我遇到的问题是,虽然 AVAudioPlayerDelegate 上有委托方法用于一段音频播放完毕,但我似乎找不到任何被调用且可以挂接到 / 的通知 / 事件 / 委托方法的引用当一段音频开始播放时收听 - 即当用户按下播放按钮时,或者甚至只是曲目发生变化时。

在做了 3 天 (!!!) 的 iOS 开发和玩耍之后,显然会有办法做到这一点,但我不确定在哪里/在哪里可以找到它。除了在我的 UI 上有一个按钮来填充信息(它工作正常,后端代码完成了它的意思),我能看到的唯一其他方法是挂钩到“轨道”在上述委托上完成播放'方法并使用它。

但这似乎有点骇人听闻。

更新

好吧,我想我暂时完全延迟了。这是你第一次在 Java 背景下摆弄 iOS 的结果。我实施了您的建议(通过一些语法调整)如下:

h 文件:

#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 告终,这令人沮丧,因为我对这里的幕后情况了解得不够多,甚至无法评估问题所在。有什么建议么?

4

1 回答 1

1

我不认为它可用!这里有一个想法:

  1. 子类 AVAudioPlayer
  2. 扩展协议
  3. 添加新的委托方法
  4. 覆盖play并实现您的委托方法并调用super

总体思路:(警告,语法可能有误!)

    // .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;
于 2013-01-10T09:32:25.813 回答