将用户提供的数据添加到数组中 - Objective-C

时间:2013-05-03 12:02:48

标签: file nsurl

我正在尝试创建一个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];
}

这段代码出了什么问题?

1 个答案:

答案 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