0

我正在尝试创建一个 Mac OS X 应用程序,其中有一些默认声音,用户可以根据需要添加其他声音。我正在将声音加载到数组中-awakeFromNib

for (NSString *str in [PreferencesController beats]) {
    resourcePath = [[NSBundle mainBundle] pathForSoundResource:str];
    beat = [[NSSound alloc] initWithContentsOfFile:resourcePath byReference:YES];
    [beat setLoops:YES];
    [beat setName:str];
    [beatsArray addObject:beat];
}

一切正常,直到应用程序尝试将用户添加的声音添加到数组中。它说:*** -[NSURL initFileURLWithPath:]: nil string parameter。我猜它找不到文件的 URL,但是当用户通过以下代码选择它时,我正在将文件复制到应用程序的目录:

if ( [openDlg runModalForTypes:[NSArray arrayWithObjects:@"aif",@"aiff",@"mp3",@"wav",@"m4a",nil]] == NSOKButton)
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSString *dataPath = [[NSBundle mainBundle] bundlePath];
    NSLog(@"Datapath is %@", dataPath);
    NSLog(@"Selected Files : %@",[[openDlg URLs] objectAtIndex:0]);

    [fileManager copyItemAtURL: [[openDlg URLs] objectAtIndex:0] toURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]] error:&error];
        NSLog(@"File copied");
    NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:[PreferencesController beats]];
    NSString *fileName = [[[openDlg URL] path] lastPathComponent];
    NSArray *fileNameArray = [fileName componentsSeparatedByString:@"."];
    [newArray addObject:[fileNameArray objectAtIndex:0]];
    NSLog(@"%@",newArray);
    [PreferencesController setBeats:newArray];
    [self awakeFromNib];
    [_tableView reloadData];
}

这段代码有什么问题?

4

1 回答 1

-1

看起来您正在尝试将文件复制到文件夹,因为您只是使用捆绑路径作为目标 URL。目标 URL 需要指定包含目标文件名的完整路径。

复制文件时尝试记录错误:

NSLog(@"File copied with error: %@", error);

此行包含错误:

[fileManager copyItemAtURL: [[openDlg URLs] objectAtIndex:0] toURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]] error:&error];

具体来说,问题在于目标 URL 是一个文件夹:

[[NSBundle mainBundle] bundlePath]

它应该是这样的:

[[[NSBundle mainBundle] bundlePath] stringByAppendingString:[[[[openDlg URLs] objectAtIndex:0] path] lastPathComponent];

然后,一旦你让它工作,正如@Abizern 在评论中所说,保存到捆绑包是一个坏主意(它是应用程序的一部分)。一旦你让它工作,你应该选择一个更好的位置来保存声音(比如应用程序的支持文档文件夹,以编程方式获取应用程序支持文件夹的路径

于 2013-05-03T12:06:44.517 回答