0

plistからロードされたカテゴリ名のリストを含むテーブルビューがあります。リストを動的に削除、追加、並べ替えてplistに保存したいのですが、以下のコードを使用しました。シミュレーターではうまく機能していますが、デバイスでクラッシュします。

In ViewDid Load:
 self.categoryFile = [[NSBundle mainBundle]pathForResource:@"Categories" ofType:@"plist"];
 self.categoryList = [[NSMutableArray alloc]initWithContentsOfFile:self.categoryFile];

- (void)tableView:(UITableView *)tableView commitEditingStyle(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath{
if (editingStyle == UITableViewCellEditingStyleDelete){
    [[self categoryList] removeObjectAtIndex:[indexPath row]];
    NSArray *indexPathsToRemove = [NSArray arrayWithObject:indexPath];
    [tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationRight];
    [tableView reloadData];
    NSArray *newArr = [[NSArray alloc]initWithArray:self.categoryList];
    [newArr writeToFile:self.categoryFile atomically:YES];
    [newArr release];
}

}

 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{

NSString *contentsToMove = [[[self categoryList] objectAtIndex:[fromIndexPath row]] retain];
[[self categoryList] removeObjectAtIndex:[fromIndexPath row]];
[[self categoryList] insertObject:contentsToMove atIndex:[toIndexPath row]];
NSArray *newArr = [[NSArray alloc]initWithArray:self.categoryList];
[newArr writeToFile:self.categoryFile atomically:YES];
[newArr release];
[contentsToMove release];
}

エラーはwriteToFile:atomically.ifの行で発生します。その行を削除すると、デバイスでも機能しますが、役に立ちません。

4

3 に答える 3

0

デバイス上のバンドル リソースに書き込むことはできません。最初に必要になったときに plist をアプリのドキュメント ディレクトリにコピーし、それ以降はそれを読んだり更新したりします。

この質問への回答から改作されたコード:

- (NSString *)pathToPlist
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Categories.plist"];
    BOOL copyProblem;
    if ([fileManager fileExistsAtPath:plistPath] == NO) {
        NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"Categories" ofType:@"plist"];
        copyProblem = [fileManager copyItemAtPath:resourcePath toPath:plistPath error:&error];
    }

    if (copyProblem)
        return nil;

    return plistPath
}

NSBundle への呼び出しの代わりに、これを self.categoryFile に割り当てます。コードはコンパイルまたはテストされていないため、詳細な疑似コードと見なす必要があります。小さなタイプミスを修正する準備をしてください。

于 2012-09-28T09:18:26.160 に答える
0

後でファイルを編集して保存する場合は、最初に NSDocumentsDirectory にファイルをコピーする必要があります (存在しない場合)。参照用にこのリンクを参照してください

あなたのplistをロードするため

BOOL success;
NSError *error;
NSString *filePath= [[NSBundle mainBundle] pathForResource:@"your_file" ofType:@"plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString * path =[[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"your_file.plist"]];

success = [fileManager fileExistsAtPath:path];
if (success) {
    self.selectedObjectsDict=[[NSMutableDictionary alloc] initWithContentsOfFile:path];       

}
else
{    

    success = [fileManager copyItemAtPath:filePath  toPath:path error:&error];
    self.selectedObjectsDict=[[NSMutableDictionary alloc]initWithContentsOfFile:filePath];


}

plistの保存用

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString * path =[[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"your_file.plist"]];
[your_dict writeToFile:path atomically:YES];
于 2012-09-28T09:18:36.670 に答える
0

あなたがやろうとしているのは、[NSBundle mainBundle] からファイルを削除することですが、これらのファイルは読み取り専用であるため、決して起こりません..

ファイルを削除して作成する場合は、DocumentsDirectory で試してください。

このリンクを参考にしてみてください

于 2012-09-28T09:19:41.997 に答える