0

この特定の機能の目的は、テーブル ビューからローカルの音声録音を表示および再生できるようにすることです。ローカル caf ファイルをロードするコードは次のとおりです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self loadFileInformation];
}

- (void)loadFileInformation
{
    items = [[NSMutableArray alloc] init];
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    for (int i = 0; i < [directoryContent count]; i++) [items addObject:[directoryContent objectAtIndex:i]];
    [self.tableView reloadData];
}

次のように、特定のファイルを再生するデリゲート メソッドを使用します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[[items objectAtIndex:indexPath.row] filePathURL] error:nil];
    avAudioPlayer.delegate = (id)self;
    [avAudioPlayer prepareToPlay];
    [avAudioPlayer play];
}

ただし、このメソッドが呼び出されると、エラーが発生します。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString filePathURL]: unrecognized selector sent to instance 0x239420'

誰かが私を正しい方向に向けることができるかどうか疑問に思っています! ローカル ディレクトリの内容が配列に格納されているdirectoryContent場合、各要素は何のオブジェクトですか? NSData?

よろしくお願いします

4

2 に答える 2

0

アイテム配列に NSString 値を追加しています。AVAudioPlayer初期化行を次のように置き換えます。

avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[items objectAtIndex:indexPath.row]] error:nil];
于 2012-07-24T09:35:52.157 に答える
0

loadFileInformation メソッドで

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

適切な方法になります。

NSSearchPathForDirectoriesInDomains とは何ですか? も参照してください。

編集:

ちなみに内容はNSStringです。そのパスで利用可能なデータを使用して、AVudioPlayer オブジェクトを割り当ててみませんか。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:[items objectAtIndex:indexPath.row]];

NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];
AVAudioPlayer * player = [[AVAudioPlayer alloc] initWithData:data error:nil];

アイテム配列にファイル名がありますが、完全なパスではありません。そのため、それをパスに追加し、そのパスで利用可能なデータを取得して、それを使用してオーディオ プレーヤーをロードしようとします。

于 2012-07-24T09:37:57.837 に答える