ボタンからのアクションとして ViewController で直接 AVAudioPlayer フレームワークを使用して mp3 ファイルを再生できますが、NSObject クラスのセレクターを呼び出して同じ mp3 を再生したい場合、失敗しました。アドバイスありがとうございます。
ViewController (audioPlayerDemo.xcodeproj) から mp3 を再生すると、次のように動作します。
Frameworks フォルダーに含まれる AVFoundation.framework
APDViewController.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface APDViewController : UIViewController <AVAudioPlayerDelegate>
{
}
@property (strong,nonatomic) AVAudioPlayer *audioPlay;
- (IBAction)play:(id)sender;
APDViewController.m
@implementation APDViewController
@synthesize audioPlay;
- (IBAction)play:(id)sender
{
NSError *error = nil;
NSData *dataAudio = [[NSData alloc] initWithContentsOfFile:
@"/Users/User/Documents/AudioPlayerDemo/AudioPlayerDemo/hello world.mp3"options:0 error:&error];
if(error){
NSLog(@" error loading data: %@ ", [error localizedDescription]);
}
else{
audioPlay = [[AVAudioPlayer alloc] initWithData:dataAudio error:&error];
if(error){
NSLog(@" error loading audio: %@ ", [error localizedDescription]);
}
else{
audioPlay.delegate = self;
[audioPlay prepareToPlay];
[audioPlay play];
}
}
}
-(void)audioPlayerDidFinishPlaying:
(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (player == audioPlay){
audioPlay = nil;
NSLog(@"audioplay = nil");
}
}
しかし、NSObject クラス (AudioPlayClass.xcodeproj) を呼び出して同じ .mp3 を再生したい場合、エラーも音もありません。動作しないコードは次のとおりです。
Frameworks フォルダーに含まれる AVFoundation.framework
APCplayObject.h
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface APCplayObject : NSObject <AVAudioPlayerDelegate>
{
}
@property (strong,nonatomic) AVAudioPlayer *audioPlay;
- (void)playAudio;
@end
APCplayObject.m
#import "APCplayObject.h"
@implementation APCplayObject
@synthesize audioPlay;
-(void)playAudio{
NSError *error = nil;
NSData *dataAudio = [[NSData alloc] initWithContentsOfFile:
@"/Users/User/Documents/AudioPlayerClass/AudioPlayerClass/hello world.mp3"options:0 error:&error];
if(error){
NSLog(@" error loading data: %@ ", [error localizedDescription]);
}
else{
audioPlay = [[AVAudioPlayer alloc] initWithData:dataAudio error:&error];
if(error){
NSLog(@" error loading audio: %@ ", [error localizedDescription]);
}
else{
audioPlay.delegate = self;
[audioPlay prepareToPlay];
[audioPlay play];
}
}
}
-(void)audioPlayerDidFinishPlaying:
(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (player == audioPlay){
audioPlay = nil;
NSLog(@"audioplay = nil");
}
}
APCviewController.m、ボタンからのアクションとしての呼び出し元:
- (IBAction)callPlay:(id)sender {
APCplayObject *a = [[APCplayObject alloc] init];
[a playAudio];
}
前もって感謝します。