1

我正在与一个团队一起开发,使用所有图像完全相同的 mac。使用我编写代码的机器,我可以以编程方式创建然后写入 pList 文件。但是当我使用我的家用机器(相同的图像)或当我的队友在他们的机器上测试代码时,我们会因[NSFileManager copyItemAtPath:toPath:error:]: source path is nil'错误而崩溃。在调试中,文件路径是有效的。但是,该捆绑包位于:

 NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
    [pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];

是零。我们正在使用 git 对我们的代码进行版本控制。我们一直将 .DS_Store 和 /userdata/ 文件排除在存储库之外,除非我错过了什么。到底是怎么回事?这是代码,几乎从这里逐字复制:

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];
4

3 回答 3

1

我相信您误解了上面列出的代码的意图。

以下块正在检查是否存在位于 path 的文件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];
}

也就是说,您必须在您的包中发布一个名为的文件,其目的是如果路径中不存在 plist,则Family.plist该文件将充当默认pListpathplist 。

于 2012-10-17T03:55:04.330 回答
0

您的应用程序包中是否Family.plist存在?

Xcode 习惯于不将更改(添加)的资源更新到包中。通常的补救措施是从模拟器/设备上删除应用程序并安装新的。

如果您的队友在他们的模拟器上安装了较旧的版本,换句话说,是全新的构建,但第一次安装的时间Family.plist早于添加到项目中的时间,那么可能就是这样。

Family.plist您的队友可以通过(在 Finder 中)导航到来验证 的存在~/Library/Application Support/iPhone Simulator,然后执行 a Show Package Contentsof yourAppName.app

于 2012-10-16T07:15:37.950 回答
0

在这种情况下,我会尝试几件事:

打印出pListpath然后检查它是否存在于本地文件系统上或者目录路径是否被错误构造的值。

如果路径构造中不存在问题,我将显式创建Family.plist并确保将其包含在Build Phases > Copy Bundle Resources.

此外,在共享环境中工作时,经常会堆积和清除我项目的派生数据通常有助于解决一些问题。您可以通过以下方式做到这一点: 1) 打开管理器。2) 导航到项目选项卡。3) 在左侧找到并选择您的项目。4) 删除派生数据。

于 2012-10-16T21:02:41.337 回答