我正在与一个团队一起开发,使用的mac都是完全相同的。使用我编写代码的机器,我可以以编程方式创建然后写入pList文件。但是当我使用我的家用机器(相同的图像)或我的队友在他们的机器上测试代码时,我们崩溃了 [NSFileManager copyItemAtPath:toPath:error:]:源路径为nil'错误。在调试中,文件路径有效。然而,捆绑包在:
NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
[pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];
是零。我们正在使用git来控制我们的代码。我们一直在保存.DS_Store和/ userdata /文件,除非我错过了什么。到底是怎么回事?以下是代码,几乎逐字逐句地从here:
中复制NSError *error;
NSArray *pListpaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *pListdocumentsDirectory = [pListpaths objectAtIndex:0];
NSString *pListpath = [pListdocumentsDirectory stringByAppendingPathComponent:@"Family.plist"];
NSFileManager *pListfileMgr = [NSFileManager defaultManager];
//Create a plist if it doesn't alread exist
if (![pListfileMgr fileExistsAtPath: pListpath])
{
NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
[pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];
}
NSMutableDictionary *thePList = [[NSMutableDictionary alloc] initWithContentsOfFile: pListpath];
[thePList setObject:[NSString stringWithFormat:@"%@", numberOfPeopleInFamilyOfOrigin] forKey:@"famSize"];
[thePList writeToFile: pListpath atomically: YES];
答案 0 :(得分:1)
我相信你误解了上面列出的代码的意图。
以下块检查是否存在位于路径pListpath
的文件。如果pListpath
处的文件不存在,则会将文件从 的文件夹中复制到pListpath
。
//Create a plist if it doesn't alread exist
if (![pListfileMgr fileExistsAtPath: pListpath])
{
NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
[pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];
}
也就是说,您必须在捆绑包中发送一个名为Family.plist
的文件,目的是如果一个plist尚不存在,该文件将充当默认 plist在路径pListpath
。
答案 1 :(得分:0)
您的App套件中是否存在Family.plist
?
Xcode习惯于不将更改(添加)的资源更新到捆绑包中。通常的补救措施是从模拟器/设备上删除应用程序并安装新的应用程序。
如果您的队友在他们的模拟器上安装了较旧的安装,换句话说,一个全新的版本,但第一次安装的时间是在Family.plist
添加到项目的时间之前,那么就可以了。
您的队友可以通过导航(在Finder中)Family.plist
来验证~/Library/Application Support/iPhone Simulator
是否存在,然后执行Show Package Contents
yourAppName.app
。
答案 2 :(得分:0)
在这种情况下,我会尝试一些事情:
打印出pListpath
的值,然后检查它是否存在于本地文件系统上,或者目录路径是否被错误构建。
如果路径构造中不存在问题,我会明确创建Family.plist
,并确保将其包含在Build Phases > Copy Bundle Resources
下。
此外,在共享环境中工作时,通常无法建立和清除项目的派生数据通常有助于解决某些问题。你可以这样做: 1)打开组织者。 2)导航到项目选项卡。 3)在左侧找到并选择您的项目。 4)删除派生数据。