从表视图中删除行 | NSUserDefaults + NSKeyedArchiver

Posted

技术标签:

【中文标题】从表视图中删除行 | NSUserDefaults + NSKeyedArchiver【英文标题】:Deleting Rows From Table View | NSUserDefaults + NSKeyedArchiver 【发布时间】:2014-03-16 10:26:18 【问题描述】:
- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    myFavsTwo = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:[[[NSUserDefaults standardUserDefaults] objectForKey:@"MyFavoritez"] mutableCopy]]];
    [self.tableView reloadData];
    NSLog(@"Number of items in my array is: %d", [myFavsTwo count]);

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    NSLog(@"Number of items in my array is: %d", indexPath.row+1);
    [myFavsTwo removeObjectAtIndex:indexPath.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
   [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myFavsTwo] forKey:@"MyFavoritez"];
    [[NSUserDefaults standardUserDefaults] synchronize];

在删除我的应用程序时不断崩溃:

       [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver
archivedDataWithRootObject:myFavsTwo] forKey:@"MyFavoritez"];

如果我“继续”调试,它仍然可以正常工作,并且一切都照常进行... 没有收到任何错误消息,或者只是一个“断点”消息

我的视图将如下所示:

- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    myFavsTwo = [NSKeyedUnarchiver unarchiveObjectWithData:[[[NSUserDefaults standardUserDefaults] objectForKey:@"MyFavoritez"] mutableCopy]];
    [self.tableView reloadData];
    NSLog(@"Number of items in my array is: %d", [myFavsTwo count]);

信息来自这里:

- (void)buttonPressed:(id) sender


    NSMutableArray *myfavs = [[[NSUserDefaults standardUserDefaults] objectForKey:@"MyFavoritez"]mutableCopy];
    if(myfavs != nil)
    
        NSLog(@"Array found. Contents: %@",myfavs);
    
    else
    
        myfavs = [[NSMutableArray alloc] initWithCapacity:0];
    
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"MyFavoritez"];
    if (dataRepresentingSavedArray != nil)
    
        NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
        if (oldSavedArray != nil)
            _myfavs = [[NSMutableArray alloc] initWithArray:oldSavedArray];
        else
            _myfavs = [[NSMutableArray alloc] init];
    

    [_myfavs addObject:self.word];
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:_myfavs] forKey:@"MyFavoritez"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"Number of items in my array is: %d", [_myfavs count]);


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 


    if ([[segue identifier] isEqualToString:@"passFavs"]) 
        FavViewController *con = segue.destinationViewController;
        con.myFavsTwo = _myfavs;    

希望那不是 TMI

【问题讨论】:

您是否尝试过这个问题中的建议 - ***.com/questions/4186251/… ?你有一个异常断点吗?我原以为您会收到有关断言失败或类似情况的消息 我删除了这一行:` [myFavsTwo removeObjectAtIndex:indexPath.row];` 然后由于未捕获的异常 'NSInternalInconsistencyException' 而删除给了我这个终止应用程序,原因:'无效更新:无效的行数在第 0 节中。更新后现有节中包含的行数 (4) 必须等于更新前该节中包含的行数 (4),加上或减去从该节中插入或删除的行数节(0 插入,1 删除)并加上或减去移入或移出该节的行数(0 移入,0 移出)。' @Paulw11 我尝试了您给我的链接上的建议,但无济于事 关于不一致的消息是有道理的,因为您正在删除一行但您没有更改基础数据源。您是否在 removeObject 和 deleteRows 调用之前尝试了 [self.tableview beginUpdates] 并在之后尝试了 [self.tableview endUpdates]? @Paulw11 是的,仍然没有错误崩溃......我不知道我做了什么,但我现在修复了它 - 写一个答案,我会给你信用 【参考方案1】:

看看这个答案中给出的建议 - crash on deleteRowsAtIndexPaths 特别是用 [self.tableView beginUpdates] 和 [self.tableView endUpdates] 括起对表格视图和数据模型的更新是一种很好的做法

【讨论】:

以上是关于从表视图中删除行 | NSUserDefaults + NSKeyedArchiver的主要内容,如果未能解决你的问题,请参考以下文章

从表视图中删除行

从表视图中删除行并从 sqlite 数据库中删除记录

从表视图中删除行时出现异常。 iOS 目标-C

如何从表视图中添加/删除子视图

从表视图中删除一行

如何将标签中的数据从表视图行操作发送到视图控制器?