2012-03-19 55 views
1

有沒有人可以請解釋一下如何正確實施tableView:commitEditingStyle:forRowAtIndexPath:方法,以便我可以正確刪除支持數組中的項目並僅顯示尚未刪除的項目?正確地從UITableView中刪除一個項目

這是我到目前爲止有:

@interface ViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> 
{ 
    IBOutlet UITableView *tableView; 

    NSArray *allItems; 
    NSMutableArray *displayItems; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    allItems = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven", nil]; 
    displayItems = [[NSMutableArray alloc] initWithArray:allItems]; 
} 

-(UITableViewCell*) tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 
    cell.textLabel.text = [displayItems objectAtIndex:indexPath.row]; 
    return cell; 
} 

@end 

回答

3

試試這個:

// 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:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     if(!deletedIndices) deletedIndices = [[NSMutableIndexSet alloc] initWithIndex:indexPath.row]; 
     else [deletedIndices addIndex:indexPath.row]; 
    } 
    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. 
    } 
} 

-(IBAction)editingDidComplete:(id)sender 
{ 

    // remove the objects from display array 
    [valueArray removeObjectsAtIndexes:deletedIndices]; 
    // Reload tableView if needed 
    [mainTableView reloadData]; 
    [mainTableView setEditing:NO]; 
} 
+0

謝謝!非常感激! – nemesis 2012-03-19 13:05:33

+0

崩潰:由於未捕獲的異常'NSInternalInconsistencyException'而終止應用程序,原因:'無效的更新:在第0節中的行數無效。更新(7)後現有節中包含的行數必須等於在更新前包含在該部分中的行(7),加上或減去從該部分插入或刪除的行數(0插入,1刪除)以及加或減移入或移出該部分的行數(0移動中,0移出)。' – nemesis 2012-03-19 16:40:46

3

實現你tableView:commitEditingStyle:forRowAtIndexPath:如下:

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

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     // remove the object from display array 
     [displayItems removeObjectAtIndex:indexPath.row]; 

     // Delete the row from the data source. 
     [aTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject: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

非常感謝!希望這會起作用! ;-) – nemesis 2012-03-19 13:06:27

+0

崩潰:由於未捕獲的異常'NSInternalInconsistencyException'而終止應用程序,原因:'無效更新:節0中的行數無效。更新後現有節中包含的行數(7)必須等於在更新之前包含在該部分中的行數(7),加上或減去從該部分插入或刪除的行數(0插入,1刪除)以及加或減移入或移出該部分的行數(0移入,0移出)。' – nemesis 2012-03-19 16:40:52

+0

你可以定位。讓我們知道您使用的是哪個代碼? – Ilanchezhian 2012-03-20 03:50:17

相關問題