2015-05-05 2 views
-1

Привет, Я пробовал Xcode, и я хочу удалить элементы из списка. Я могу показать кнопку удаления, но после нажатия кнопки удаления она не будет удалена. Код удаления находится в конце кода. Что-то не хватает в удалении части кода, и я не совсем уверен, что это такое.Я не могу удалить элемент из списка Xcode

#import "ToDoListTableViewController.h" 
#import "ToDoItem.h" 
#import "AddToDoItemViewController.h" 

@interface ToDoListTableViewController() 

@property NSMutableArray *toDoItems; 

@end 

@implementation ToDoListTableViewController 

- (void)loadInitialData { 
    ToDoItem *item1 = [[ToDoItem alloc] init]; 
    item1.itemName = @"Buy milk"; 
    [self.toDoItems addObject:item1]; 
    ToDoItem *item2 = [[ToDoItem alloc] init]; 
    item2.itemName = @"Buy eggs"; 
    [self.toDoItems addObject:item2]; 
    ToDoItem *item3 = [[ToDoItem alloc] init]; 
    item3.itemName = @"Read a book"; 
    [self.toDoItems addObject:item3]; 
} 

- (IBAction)unwindToList:(UIStoryboardSegue *)segue { 
    AddToDoItemViewController *source = [segue sourceViewController]; 
    ToDoItem *item = source.toDoItem; 
    if (item != nil) { 
     [self.toDoItems addObject:item]; 
     [self.tableView reloadData]; 
    } 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.toDoItems = [[NSMutableArray alloc] init]; 
    [self loadInitialData]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:   
(NSInteger)section { 
    // Return the number of rows in the section. 
    return [self.toDoItems count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ListPrototypeCell" forIndexPath:indexPath]; 
    // Configure the cell... 
    ToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row]; 
    cell.textLabel.text = toDoItem.itemName; 

    if (toDoItem.completed) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    return cell; 
} 

// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     // Delete the row from the data source 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 
+2

Я думаю, ваша проблема в том, что, когда deleteRowsAtIndexPaths называется, он обновляет источники данных Tableview в. Это значит, что метод cellForRowAtIndexPath снова вызван, и поскольку вы ничего не изменили в источнике данных, табличное представление обновляется точно так, как было раньше. – milesper

+0

Добавьте две строки в свой ответ ... [array removeObjectAtIndex: indexPath.row]; [tableView reloadData]; –

ответ

0

В вашем методе tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath вы удаляете только ячейку. Вы также должны удалить свои фактические данные.

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

     // Delete data from array 
     [self.toDoItems removeObjectAtIndex:indexPath.row]; 

     // Delete the row from the data source 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 
0

Когда deleteRowsAtIndexPaths вызывается он обновляет данные tableViews, которые затем называет cellForRowAtIndexPath. Теперь, когда вы не изменили данные, ничего не изменится в tableView.

0
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     // Delete data from array 
     [self.toDoItems removeObjectAtIndex:indexPath.row]; 

     // Reload table -> it's OK 
     [tableView reloadData]; 
    } else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 
Смежные вопросы