如何使用commitEditingStyle从plist删除数组?

我有一个UITableView由plist的数组键通过此代码填充:

-(void)viewWillAppear:(BOOL)animated { // get paths from root direcory NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:(NSString *)plistPath]; viewerKeys = [dictionary allKeys]; [self.tableView reloadData]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ViewerName"]; UILabel *label = (UILabel *)[cell viewWithTag:1000]; label.text = [viewerKeys objectAtIndex:indexPath.row]; return cell; } 

我试图启用滑动删除表视图中的每一行,当然这意味着我不得不删除该行以及plist中的数组。 这是我迄今为止所尝试的:

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:(NSString *)plistPath]; NSString *key = [viewerKeys objectAtIndex:indexPath.row]; [dictionary removeObjectForKey:[NSString stringWithFormat:@"%@", key]]; NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; } 

但是,它不是把数据写回plist,我得到这个错误:

Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).

这是我的plist的样子:

 <plist version="1.0"> <dict> <key>(null)</key> <array> <string>Username</string> <string>Password</string> <string>http://www.google.com</string> <string>/whatever</string> </array> <key>Hello</key> <array> <string>admin</string> <string></string> <string>https://www.whatever.com</string> <string>/things</string> </array> </dict> </plist> 

任何帮助将是伟大的!

你的问题是你只是从字典中删除该对象。 您的查看器viewerKeys仍然保留移除的对象键。 在调用deleteRowsAtIndexPaths:之前,您需要更新viewerKeys deleteRowsAtIndexPaths:

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:(NSString *)plistPath]; NSString *key = [viewerKeys objectAtIndex:indexPath.row]; [dictionary removeObjectForKey:[NSString stringWithFormat:@"%@", key]]; [dictionary writeToFile:plistPath atomically:YES]; viewerKeys = [dictionary allKeys]; NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; 

}