我正在尝试创建一个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];
}
这段代码出了什么问题?
答案 0 :(得分:-1)
您似乎正在尝试将文件复制到文件夹,因为您只是将捆绑路径用作目标网址。目标URL需要指定完整路径,包括目标文件名。
尝试在复制文件时记录错误:
NSLog(@"File copied with error: %@", error);
此行包含错误:
[fileManager copyItemAtURL: [[openDlg URLs] objectAtIndex:0] toURL: [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]] error:&error];
具体来说,问题是目标网址是一个文件夹:
[[NSBundle mainBundle] bundlePath]
应该是这样的:
[[[NSBundle mainBundle] bundlePath] stringByAppendingString:[[[[openDlg URLs] objectAtIndex:0] path] lastPathComponent];
然后,一旦你有它工作,正如@Abizern在评论中所说,保存到捆绑包是一个坏主意(它是应用程序的一部分)。 一旦你有它工作,你应该选择一个更好的位置来保存声音(如应用程序的支持文档文件夹,Programmatically get path to Application Support folder)