2015-01-17 3 views
-1

У вас есть знакомый монитор, в котором есть uibarbuttonItem для редактирования списка друзей и другого uibarbuttonitem для создания групп для групповых чатов.Удаленная строка в виде таблицы снова появляется при навигации назад

Имейте несколько переключателей для переключения контроллеров.

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

Удаленные строки в виде таблицы появляется при навигации обратно к TableView

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

Im не в состоянии найти то, что часть кода я м отсутствует или что именно я делаю неправильно.

Если кто-нибудь может обратить внимание на это.

Поймите так много.

Спасибо.

+0

Нам нужно посмотреть, как и где создаются чаты, и как вы переходите к TableView. – rdelmar

+0

chatroom - целое или объект? – EridB

+0

chatroom - объект NSMutableArray, объявленный как ivar – user1120133

ответ

1

При совершении удаления, код удаляет объекты из chatrooms, который является источником данных в виде таблицы в вашем случае, но это происходит в памяти приложения, в источнике, из которого chatrooms заполняемых не меняется. Таким образом, говоря в MVC, состояние модели приложения не обновляется после изменения состояния представления.

Каждый раз, когда отображается представление таблицы, ваш код заполняет chatrooms в refreshTable, если состояние модели не было изменено, код получает тот же список, что и раньше, поэтому представление таблицы не изменяется.

EDIT: Вместо того, чтобы использовать другой подход для обновления вида таблицы, вам нужно подумать о том, что делает ваше приложение в этом представлении таблицы. Если пользователь может удалить материал в представлении таблицы, должна ли ваша модель обновления приложения (эта модель может быть локальной или удаленной базой данных, файлом списка свойств и т. Д.)? Если да, то обновите модель, когда пользователь вставляет или удаляет строки в представлении таблицы; ну, если нет, тогда вы задаете вопрос, который не является проблемой, или, может быть, представление таблицы должно отключить редактирование.

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];  
    } 
} 

То есть, возможно, потребуется реализовать метод deleteChatroom: класса PFQuery.

+0

У меня только был момент Déjà vu :) – myte

+0

Да, вы очень правы из-за стола обновления, он не удаляет строки и не обновляет одни и те же старые строки снова и снова. В этой таблице в основном вы добавляете или удаляете друзей из списка и создаете групповые чаты, но еще одна особенность, которую я хотел добавить, - это то, что если вы хотите удалить групповой чат – user1120133

+0

Это новый вопрос. Ваше приложение загружает данные из источника, который хранит данные о друзьях и чатах. Этот ** источник ** должен предоставлять интерфейс для удаления файлов. И ваше приложение должно удалить материал через этот интерфейс. @ user1120133 – wcd

Смежные вопросы