1

私はここ数日iOSSDKで遊んでいて、現在再生中の曲を表示するうなずく小さなアプリケーションを作成することで、学んだ概念とアプローチを取り入れ始めているところまで来ています。音楽ライブラリから私のiPhoneにあります。

私が遭遇した問題は、オーディオの一部の再生が終了したときにAVAudioPlayerDelegateにデリゲートメソッドがありますが、呼び出されて/にフックできる通知/イベント/デリゲートメソッドの参照が見つからないようです。オーディオの一部が再生を開始したとき、つまりユーザーが再生ボタンを押したとき、またはトラックだけが変更されたときにリッスンしました。

iOS開発を丸3日(!!!)行って遊んだ後、それを行う方法は明らかにあるでしょうが、それをどこで何を見つけるかはわかりません。情報を入力するために現在行っているように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 に答える