2012-09-28 5 views
0

J'ai une vue de table avec une liste de noms de catégories chargés à partir du plist. je veux supprimer dynamiquement, ajouter et réorganiser la liste et l'enregistrer dans le plist.i utilisé le code ci-dessous et il fonctionne très bien sur le simulateur, mais son écrasement sur l'appareil.Modifier une tableView et mettre à jour le 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]; 
} 

L'erreur est à venir à la ligne writeToFile: atomically.if i supprimer cette ligne son travail sur l'appareil, mais aussi d'aucune utilité.

Répondre

0

Vous ne pouvez pas écrire dans des ressources groupées sur le périphérique. Copiez le fichier plist dans le répertoire de documents de votre application dès que vous en avez besoin et lisez/mettez-le à jour.

code adapté de answer to this question:

- (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 
} 

assigner à self.categoryFile au lieu de l'appel vers NSBundle. Le code n'a pas été compilé ou testé donc devrait être considéré comme un code détaillé, s'il vous plaît soyez prêt à corriger les petites fautes de frappe.

+0

u peut me donner un peu de code que je ne sais pas ce que vous dites et que je suis nouveau Chaque application doit Objective-C – Chandu

+0

une lecture - seule paquet, puis un en lecture écrire sandbox qui inclut, entre autres, un répertoire de documents. Vous copiez des fichiers dans le répertoire de documents à partir de l'ensemble si vous souhaitez leur écrire dans votre application. Code devrait être assez facile à creuser –

+0

@Chandu mis à jour avec du code. –

0

Vous devez d'abord copier le fichier dans NSDocumentsDirectory (s'il n'y est pas présent) si vous souhaitez modifier et enregistrer le fichier ultérieurement. Voir cette Link for reference

Pour charger votre 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]; 


} 

Pour sauver la 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]; 
0

Ce que vous essayez de faire est de supprimer un fichier de [NSBundle mainBundle] qui ne peut jamais arriver que ces fichier sont en lecture seule.

Si vous souhaitez supprimer et créer des fichiers, essayez-le dans DocumentsDirectory

Essayez cette link pour référence

+0

pouvez-vous me fournir du code s'il vous plaît – Chandu

+0

vérifier ma réponse mise à jour – AppleDelegate

Questions connexes