2

NSDictionaryのplistをアプリのDocumentsフォルダーに保存しようとしています。私はまだデバイスでこれを試していませんが、テスト目的でシミュレーターで動作させたいと思います。この[self createDictionaryFromChoreList]メソッドは、別のクラスのデータからNSDictionaryを作成するだけです。このコードをWebドキュメントからコピー/貼り付けしましたが、ファイルが保存されているかどうかを確認すると、保存されていないことがわかりました。これがメソッドブロックです。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];
NSString *path = [documentsDirectory stringByAppendingPathComponent:plistName];

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];
[choresDictionary writeToFile:path atomically:YES];

どんな助けでも大歓迎です。前もって感謝します。

-S

4

7 に答える 7

5

また、によって返されるBOOLをキャプチャする必要がありwriteToFile:atomically:ます。これにより、書き込みが成功したかどうかがわかります。

また、適切なドキュメントフォルダを探していますか?シミュレーターに複数のアプリがある場合、Finderで間違ったアプリのドキュメントフォルダーを簡単に開くことができます。私は一度それをしました、そしてそれは私に数時間の欲求不満を要しました。

Edit01:

writeToFile:atomically:falseを返すと、ファイルが存在しない理由が説明されます。最も簡単な説明は、ディクショナリ内の何かがプロパティリストオブジェクトではないということです。

NSDictionaryドキュメントから:

このメソッドは、ファイルを書き出す前に、含まれているすべてのオブジェクトがプロパティリストオブジェクト(NSData、NSDate、NSNumber、NSString、NSArray、またはNSDictionaryのインスタンス)であることを再帰的に検証し、すべてのオブジェクトがプロパティリストオブジェクトでない場合はNOを返します。結果のファイルは有効なプロパティリストではありません。

それがplistに変換されるのを防ぐために、辞書の奥深くに埋め込まれた1つの非plistオブジェクトを使用するだけです。

于 2010-01-22T02:15:42.897 に答える
1

これは私がすぐに作成したもので、名前と会社のplistディレクトリがドキュメントディレクトリに正しく書き込まれます。辞書の作成方法に問題があるのではないかと思います。これを自分で試してから、コードを追加して、機能することを確認してください。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *plistDirectory = [paths objectAtIndex:0];
NSString *plistPath = [plistDirectory stringByAppendingPathComponent:@"userCompany.plist"];

NSArray *userObjects = [[NSArray alloc] initWithObjects:@"Joe", @"Smith", @"Smith Co", nil];
NSArray *userKeys = [[NSArray alloc] initWithObjects:@"First Name", @"Last Name", @"Company", nil];

NSDictionary *userSettings = [[NSDictionary alloc] initWithObjects:userObjects forKeys:userKeys];

[userSettings writeToFile:plistPath atomically:YES];
于 2010-01-22T02:07:03.873 に答える
1

plist データをシリアル化することを忘れないでください。

これは、plist に情報を書き込むために使用するコードのスニペットです。

NSString *errorString;

NSData *data = [NSPropertyListSerialization dataFromPropertyList:plistDict 
                                                       format:NSPropertyListXMLFormat_v1_0 
                                              errorDescription:&errorString];
[plistDict release];

if (!data) {
  NSLog(@"error converting data: %@", errorString);
  return NO;    
}

if ([data writeToFile:[XEraseAppDelegate loadSessionPlist] atomically: YES]) {
  return YES;
} else {

   NSLog(@"couldn't write to new plist");

 return NO;
}
于 2010-01-22T02:34:46.990 に答える
0

私もこの問題に遭遇していました。私の場合、キーに使用していたことが判明しましたNSNumbers-これは無効です。

于 2012-02-25T00:25:52.630 に答える
0

あなたが書いているファイルの名前がSOEMTHINGchores.plistであるというのは正しいですか?

作成者:

NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];

また、次の出力は何ですか。

[choresDictionary print];

いくつかの追加情報は、これをデバッグするのに役立ちます。

于 2010-01-22T02:03:43.767 に答える
0

にブレークポイントを挿入します

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];

これで、マウスを上にドラッグchoresDictionaryしてツールチップでサイズが0x0でないことを確認するか、NSLogなどを実行できchoresDictionary ますNSLog(@"%@",choresDictionary);。辞書にはキーとキーと値のペアが0あると思います。そのため、ドキュメントフォルダにnullが入ります。 。

ありがとう、

マッドハップ

于 2010-01-22T12:00:59.377 に答える
0

ファイルを探している正確な場所はどこですか?

私はまったく同じコードを持っていますが、それは私にとってはうまくいきます。

ファイルを取得するには、深く掘り下げる必要があります。何かのようなもの:

/Users/myUserName/Library/Application Support/iPhone Simulator/User/Applications/0E62A607-8EEB-4970-B198-81CE4BDDB7AA/Documents/data.plist

また、パス内の HEX 番号は実行ごとに変化します。そのため、実行するたびにファイルパスを出力します。

于 2010-01-22T06:24:38.497 に答える