1

いくつかのコメントを plist に保存しようとしていますが、それは単なるプロトタイプであるため問題ありません。問題は、plist から読み取ることができることですが、その後書き込みと読み取りを試みると、「範囲外の配列」例外がスローされます。ここで何が間違っているのかわかりません。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Comments" ofType:@"plist"];
NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];


NSMutableDictionary *newComment = [NSMutableDictionary dictionary];
[newComment setValue:commentTitle.text forKey:@"title"];
[newComment setValue:comment forKey:@"comment"];


[plistArray addObject:newComment];
[plistArray writeToFile:filePath atomically:NO];

それはうまくいきます、それから私は読んでみます:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Comments" ofType:@"plist"];
NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];


NSMutableDictionary *dictionary = (NSMutableDictionary *) [plistArray objectAtIndex:0];

NSLog(@"%@", [dictionary objectForKey:@"title"]);

そして、それは例外をスローします。

項目を plist に手動で追加すると、正常に動作します。これは、読み取りコードが正常であることを意味すると思います。

それは私のplistの構造でしょうか?

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <array>
 </array>
 </plist>

*キャッチされない例外 'NSRangeException' が原因でアプリを終了します。理由: '-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (1)'

plistに書き込む前に、配列に「説明」を追加しました。次のコードを使用する場合:

NSString *aDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//    NSString *aFilePath = [NSString stringWithFormat:@"%@/Comments.plist", aDocumentsDirectory];
//
//    NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:aFilePath];

戻り値は (null)

しかし、私が使用する場合:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Comments" ofType:@"plist"];
NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

配列の内容が表示され、すべて正常に動作しています。

問題は次のとおりです。どちらの方法でもファイルに書き込むことができず、「NO」を返し続けます。そして、私はすでに権限を確認しました

4

4 に答える 4

4

ファイルをmainBundleに書き込もうとしています。間違いなく不可能です。plist ファイルをアプリのDocumentsまたはApplication Supportフォルダーに書き込む必要があります。

ドキュメント ディレクトリにファイル パスを作成:

NSString *aDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSString *aFilePath = [NSString stringWithFormat:@"%@/Comments.plist", aDocumentsDirectory];

FilePath への書き込み

[plistArray writeToFile:aFilePath atomically:YES];

FilePath から読み取る

NSMutableArray *plistArray = [[NSMutableArray alloc] initWithContentsOfFile:aFilePath];
于 2012-07-26T12:37:57.840 に答える
0

あなたのコードには 2 つの問題があります。

  1. (問題になる場合とそうでない場合があります)。ファイルが最初に存在しない場合、initWithContentsOfFile:セレクターは nil を返し、残りのコードはノーオペレーションになります。

  2. (おそらく原因)。バンドル リソース ディレクトリに書き込むことはできません。代わりに、Documents または Caches ディレクトリにファイルを保存してください。

ドキュメント ディレクトリを見つけるには、次のようにします。

- (NSString*) pathForDocument:(NSString*)documentName {
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    if(documentDirectories.count < 1) return nil;
    return [[documentDirectories objectAtIndex:0] stringByAppendingPathComponent:documentName];
}
于 2012-07-26T12:05:29.730 に答える
0

まず第一に、なぜファイルをバンドルに書き込むのですか?

次に、問題に対処するために、実際にファイルを書き込んだかどうかを確認してください。

if ([plistArray writeToFile:filePath atomically:NO])
    NSLog (@"Written");
else
    NSLog (@"Not Written");

-(void)descriptionまた、辞書の内容を確認するために 配列を読み取ったときに配列をログに記録します。

編集

あなたが言ったように、あなたはあなたのplistに書いていません。とりあえず、デスクトップにテスト plist を作成します。

NSString *testPath = [[NSString stringWithString:@"~/Desktop/Comments.plist"] stringByExpandingTildeInPath];
if ([plistArray writeToFile:testPath atomically:NO])
    NSLog (@"Written");
else
    NSLog (@"Not Written");    

それでも Not Written が返される場合は、辞書に問題があります。それは単なる文字列であるため、私は疑問に思っています(ただし、stackoverflowで質問するためのプレースホルダーになる可能性があります。ドキュメントには、辞書のクラスはNSData、NSDate、NSNumber、NSString、NSArray、またはNSDictionaryでなければならないと記載されています)。ただし、それが書かれている場合は、アクセス許可のためにバンドルに書き込まれないと思います。その場合、plist の場所をバンドル以外の場所に変更する必要があります。これを強くお勧めします。

于 2012-07-26T12:09:43.800 に答える
-2

配列に項目を 1 つだけ配置する場合は、読み取り時に 1 ではなくインデックス 0 を使用する必要があります。

NSMutableDictionary *dictionary = (NSMutableDictionary *) [plistArray objectAtIndex:0];
于 2012-07-26T12:00:39.427 に答える