1

私はチームで開発しており、すべてまったく同じイメージの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/ファイルをリポジトリから除外してきました。何が起こっている?これがコードで、ここからほぼ逐語的に再現されています。

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

上にリストしたコードの意図を誤って解釈していると思います。

次のブロックは、パスにあるファイルの存在をチェックしています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

于 2012-10-17T03:55:04.330 に答える
0

AppBundleFamily.plist内に存在しますか?

Xcodeには、変更された(追加された)リソースをバンドルに更新しないという習慣があります。通常の解決策は、シミュレーター/デバイスからアプリを削除し、新しくインストールすることです。

チームメイトがシミュレーターに古いインストール、つまり新しいビルドを持っているが、最初のインストールの時間がFamily.plistプロジェクトに追加された時間より前である場合、これはそれである可能性があります。

チームメイトは、Family.plist(Finderで)に移動しての存在を確認してから~/Library/Application Support/iPhone Simulator、のを実行できます。Show Package ContentsyourAppName.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 に答える