Ios 返回时,tableview中已删除的行将重新出现

Ios 返回时,tableview中已删除的行将重新出现,ios,uitableview,Ios,Uitableview,拥有friendsviewcontroller,其中使用UIBarButtonim编辑好友列表,使用其他UIBarButtonim为群聊天室创建群 具有多个用于切换视图控制器的序列 - (void)viewDidLoad { [super viewDidLoad]; self.title = @"Groups"; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style

拥有friendsviewcontroller,其中使用UIBarButtonim编辑好友列表,使用其他UIBarButtonim为群聊天室创建群

具有多个用于切换视图控制器的序列

- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"Groups";
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStylePlain target:self
                                                                         action:@selector(actionNew)];
self.tableView.separatorInset = UIEdgeInsetsZero;
chatrooms = [[NSMutableArray alloc] init];
}

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if ([PFUser currentUser] != nil)
{
    [self refreshTable];
}
else LoginUser(self);
}

#pragma mark - User actions
- (void)actionNew
 {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Create New Group" message:nil delegate:self
                                      cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
 }

#pragma mark - UIAlertViewDelegate
 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:    (NSInteger)buttonIndex=
 {
if (buttonIndex != alertView.cancelButtonIndex)
{
    UITextField *textField = [alertView textFieldAtIndex:0];
    if ([textField.text isEqualToString:@""] == NO)
    {
        PFObject *object = [PFObject objectWithClassName:PF_CHATROOMS_CLASS_NAME];
        object[PF_CHATROOMS_NAME] = textField.text;
        [object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
        {
            if (error == nil)
            {
                [self refreshTable];
            }
            else [ProgressHUD showError:@"Network error."];
        }];
    }
}
 }
- (void)refreshTable
 {
[ProgressHUD show:nil];
PFQuery *query = [PFQuery queryWithClassName:PF_CHATROOMS_CLASS_NAME];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
    if (error == nil)
    {
        [chatrooms removeAllObjects];
        for (PFObject *object in objects)
        {
            [chatrooms addObject:object];
        }
        [ProgressHUD dismiss];
        [self.tableView reloadData];
    }
    else [ProgressHUD showError:@"Network error."];
}];
 }

#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [chatrooms count];
 }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];

PFObject *chatroom = chatrooms[indexPath.row];
cell.textLabel.text = chatroom[PF_CHATROOMS_NAME];

return cell;
 }

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    PFObject *chatroom = [chatrooms objectAtIndex:indexPath.row];
    [chatrooms removeObjectAtIndex:chatroom];
    //[chatrooms removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];    
}
}
#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
PFObject *chatroom = chatrooms[indexPath.row];
NSString *roomId = chatroom.objectId;
CreateMessageItem([PFUser currentUser], roomId, chatroom[PF_CHATROOMS_NAME]);
ChatView *chatView = [[ChatView alloc] initWith:roomId];
chatView.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:chatView animated:YES];
 }
导航回表格视图时,表格视图中已删除的行将重新出现

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    PFObject *chatroom = [chatrooms objectAtIndex:indexPath.row];
    [chatrooms removeObjectAtIndex:chatroom];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];   
}
}
我无法找到我丢失了哪段代码,或者我到底做错了什么

如果有人能指出这一点

我会非常感激的


谢谢。

提交删除时,您的代码会从您案例中表视图的数据源
聊天室中删除对象,但这会发生在应用程序的内存中,从中填充
聊天室的源不会更改。因此,在MVC中,视图状态更改后,应用程序的模型状态不会更新

每次显示表视图时,您的代码都会填充
refreshTable
中的
聊天室
,如果模型的状态没有更改,则代码将获得与以前相同的列表,因此表视图不会更改

编辑:你需要考虑你的应用程序在这个表视图中做什么,而不是使用另一种方法来刷新表视图。如果用户可以删除表视图中的内容,应用程序是否也应该更新模型(该模型可以是本地或远程数据库、属性列表文件等)?如果是,则在用户在表视图中插入或删除行时更新模型;如果不是,那么您提出的问题不是问题,或者表视图应该关闭编辑

EDIT1:

如果确实需要根据代码更新数据,则可能需要执行以下操作:

- (void)tableView:(UITableView *)tableView 
        commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
        forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        PFObject *chatroom = [chatrooms objectAtIndex:indexPath.row];
        [chatrooms removeObjectAtIndex:indexPath.row];
        PFQuery *query = [PFQuery queryWithClassName:PF_CHATROOMS_CLASS_NAME];
        [query deleteChatroom:chatroom];
        [tableView deleteRowsAtIndexPaths:@[indexPath] 
                         withRowAnimation:UITableViewRowAnimationAutomatic];    
    }
}

也就是说,您可能需要实现类
PFQuery

的方法
deleteChatroom:
,我们需要了解聊天室是如何创建的,在哪里创建的,以及如何导航回TableView。聊天室是一个整数还是一个对象?聊天室是一个声明为ivaris聊天室的NSMutableArray对象?似乎需要这样做[聊天室移除objectatindex:indexath.row];我想这就是@user1120133在ViewDidAspect中暗示的。。[自我刷新];你似乎没有从任何数据来源的地方删除聊天室,所以每次视图出现时,它都会从该位置刷新表。我只是有一个似曾相识的时刻:)是的,你是非常正确的,因为刷新表它不会一次又一次地删除行和刷新相同的旧行。在这个表视图中,基本上你可以从列表中添加或删除好友并创建群聊天室,但我想添加的另一个功能是,如果你想删除群聊天室,那该怎么办?这是一个新问题。您的应用程序从存储朋友和聊天室数据的源加载数据。此源应提供删除内容的接口。你的应用程序应该通过这个界面删除内容@user1120133i添加了重载数据而不是刷新表,但现在它不再删除行,因为未捕获的异常“NSRangeException”而导致应用程序崩溃,消息终止应用程序,原因:“***-[\uu NSArrayM removeObjectAtIndex:]:索引140378874219152越界[0..12]”我的朋友,你需要先整理一下。您可能需要重写应用程序的一部分,而不仅仅是几行代码。当您只是更改一两行代码以尝试使某些内容正常工作时,就会发生这种情况。不要在没有清晰思考的情况下匆忙编写代码@用户1120133