简体   繁体   English

滑动以删除 TableView 行

[英]Swipe To Delete TableView Row

I have my array:我有我的阵列:

self.colorNames = [[NSArray alloc] 
initWithObjects:@"Red", @"Green",
@"Blue", @"Indigo", @"Violet", nil];

I've tried everything I can find, but there's always errors.我已经尝试了我能找到的一切,但总是有错误。 I want to be able to swipe so that the delete button appears, and then press the delete button and have that row removed.我希望能够滑动以便出现删除按钮,然后按下删除按钮并删除该行。

Full code (everything relating to the table):完整代码(与表格相关的所有内容):

// HEADER FILE
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

  IBOutlet UITableView *tableView;
    NSMutableArray *colorNames;

}
@property (strong, nonatomic) NSArray *colorNames;


@end

// IMPLEMENTATION

#import "ViewController.h"

@implementation ViewController

@synthesize colorNames; 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.colorNames = [[NSMutableArray alloc] 
    initWithObjects:@"Red", @"Green",
    @"Blue", @"Indigo", @"Violet", nil];

    [super viewDidLoad];
    //[tableView setEditing:YES animated:NO];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
 }

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView  numberOfRowsInSection:(NSInteger)section {
    int count = [colorNames count];
    return count;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

}  

 // Customize the appearance of table view cells.
 - (UITableViewCell *)tableView:(UITableView *)tableView 
 cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 static NSString *CellIdentifier = @"Cell";

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

 if (cell == nil) {
     cell = [[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleDefault
             reuseIdentifier:CellIdentifier];

 }
     // Configure the cell.
     cell.textLabel.text = [self.colorNames objectAtIndex: [indexPath row]];

 return cell;

 }

You have to implement the necessary UITableViewDelegate and UITableViewDataSource methods.你必须实现必要的UITableViewDelegateUITableViewDataSource方法。

First, add this:首先,添加以下内容:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

Then:然后:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //remove the deleted object from your data source.
        //If your data source is an NSMutableArray, do this
        [self.dataArray removeObjectAtIndex:indexPath.row];
        [tableView reloadData]; // tell table to refresh now
    }
}

For a start, your colorNames should be an NSMutableArray rather than an NSArray.首先,您的colorNames应该是 NSMutableArray 而不是 NSArray。 You can't add or remove objects from a regular (non-mutable) array;您不能在常规(非可变)数组中添加或删除对象; you'd have to recreate it each time you made a change.每次进行更改时都必须重新创建它。 Switching that will make this easier.切换将使这更容易。 For your implementation of -tableView:commitEditingStyle:forRowAtIndexPath: , you'll then be able to do something like this:对于-tableView:commitEditingStyle:forRowAtIndexPath: ,您将能够执行以下操作:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(editingStyle == UITableViewCellEditingStyleDelete)
    {
        [colorNames removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    }
}

Implement the following method:实现以下方法:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleDelete;
}

Swift 3 and Swift 4 answer without using reloadData Swift 3 和 Swift 4 在不使用 reloadData 的情况下回答

I prefer using deleteRows instead of using reloadData.我更喜欢使用 deleteRows 而不是使用 reloadData。

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    // Enables editing only for the selected table view, if you have multiple table views
    return tableView == yourTableView
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        // Deleting new item in the table
        yourTableView.beginUpdates()
        yourDataArray.remove(at: indexPath.row)
        yourTableView.deleteRows(at: [indexPath], with: .automatic)
        yourTableView.endUpdates()
    }
}

This is what worked for me这对我有用

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

    if (editingStyle == UITableViewCellEditingStyleDelete){
        Comment *comment = [self.commentArray objectAtIndex:indexPath.row];
        dispatch_async(kBgQueue, ^{
            if([self.thePost deleteCommentForCommentId:comment.commentId]){
                if (indexPath.row < self.commentArray.count) {
                    [self.commentArray removeObjectAtIndex:indexPath.row];
                }
                dispatch_async(dispatch_get_main_queue(), ^{

                    [self.tvComments reloadData];
                });
            }
        });
    }
     [self.tvComments reloadData];
}

Swift Version:迅捷版:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
     if editingStyle == UITableViewCellEditingStyle.Delete {
         dataArray?.removeAtIndex(indexPath.row)
         tableview.reloadData()
     }
}

Swift 4 Version :斯威夫特 4 版本:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .destructive, title: "delete") { (action, indexPath) in
        // delete item at indexPath

    }
    return [delete]
}

You have to add UITableViewDelegate and UITableViewDataSource methods.您必须添加UITableViewDelegateUITableViewDataSource方法。

You can add multiple buttons on UITableView Row Swipe:您可以在 UITableView Row Swipe 上添加多个按钮

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
        return YES;
    }

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
        {
            // Delete something here
        }];
        delete.backgroundColor = [UIColor redColor];
    
        UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
        {
           //You function call:
        }];
        more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1];
    
        return @[delete, more]; //array with all the buttons.
    }`

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM