通过点击左侧的删除控件直接删除 UITableViewCell,但不显示右侧的删除按钮

UITableViewCell get deleted directly by tapping delete control on the left but not show delete button on the right

当我涉及[tableView setEditing:YES animated:YES]时,删除控件显示在左侧的每个单元格上,我想做的是在点击删除控件时获取事件,直接删除单元格但不显示删除按钮在右边。

我知道苹果的标准做法是在右侧显示删除按钮,当我点击它时,数据源的

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

参与其中,我不想这样做的原因是我的单元格是由水平滚动的滚动视图自定义的,因此滚动以显示删除按钮会使它变得一团糟,所以我不会实现

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

在我的数据源中。

有什么想法吗?

你做的一种方法是,自定义单元格并使用你自己的方式删除单元格,例如,

通过将 UITableviewCell 命名为类似 CustomCellTableViewCell 的子类来创建新的自定义单元格 在 CustomCellTableViewCell.h 中定义一个委托方法,例如,

 #import <UIKit/UIKit.h>

 @class CustomCellTableViewCell;
 @protocol CellDelegate <NSObject>
 - (void)deleteCell:(CustomCellTableViewCell *)cell;
 @end


 @interface CustomCellTableViewCell : UITableViewCell
 + (CustomCellTableViewCell *)createCell;
 @property (weak, nonatomic) IBOutlet UIButton *deleteButton;
 @property (weak, nonatomic) IBOutlet UILabel *descriptionLabel;
 @property (weak,nonatomic)  id<CellDelegate> cellDelegate;
 - (IBAction)deleteAction:(id)sender;
 - (void)showDeleteButton;
 - (void)hideDeleteButton;
 @end

并在 CustomCellTableViewCell.xib 中添加一个按钮并设置标签连接到 deleteButtondescriptionLabel

CustomCellTableViewCell.m 文件中

 #import "CustomCellTableViewCell.h"

 @implementation CustomCellTableViewCell

 - (void)awakeFromNib {
  // Initialization code
   }


 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if(self)
    {
      self = [CustomCellTableViewCell createCell];
    }
    return self;
 }

 + (CustomCellTableViewCell *)createCell
 {
     NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CustomCellTableViewCell" owner:nil options:nil];
     if ([arrayOfViews count] < 1) {
        return nil;
     }
     for (id item in arrayOfViews) {
       if([item isKindOfClass:[UITableViewCell class]])
           return item;
     }
     return nil;
 }

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  [super setSelected:selected animated:animated];

   // Configure the view for the selected state
 }

 - (IBAction)deleteAction:(id)sender {
    if([self.cellDelegate respondsToSelector:@selector(deleteCell:)])
    {

       [self.cellDelegate deleteCell:self];
    }
  }

 - (void)showDeleteButton
 {
   CGRect destRect = self.descriptionLabel.frame;
   destRect.origin.x += 80;
   [UIView animateWithDuration:0.3 animations:^{
    self.descriptionLabel.frame = destRect;
   }];
 }

 - (void)hideDeleteButton
 {
   CGRect destRect = self.descriptionLabel.frame;
   destRect.origin.x = 0;
   [UIView animateWithDuration:0.3 animations:^{
     self.descriptionLabel.frame = destRect;
   }] ;

 }
 @end

并在控制器 .m 文件中

- (void)viewDidLoad {
   [super viewDidLoad];
   stringsArray  = [[NSMutableArray alloc]initWithObjects:@"apple",@"dell",@"windows",@"nokia",@"sony",@"hp",@"lenovo", nil];
}

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

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


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

  if(customEditTableView)
     [cell showDeleteButton];
  else
     [cell hideDeleteButton];

  cell.cellDelegate = self;
  cell.descriptionLabel.text = [stringsArray objectAtIndex:indexPath.row];
  return cell;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   return 50.0f;
}
- (IBAction)deleteCellsAction:(id)sender
{
  if(customEditTableView)
      customEditTableView = NO;
  else
      customEditTableView = YES;

  [self.aTableView reloadData];

}

- (void)deleteCell:(CustomCellTableViewCell *)cell
{
   NSIndexPath *indexPath = [self.aTableView indexPathForCell:cell];
   [stringsArray removeObjectAtIndex:indexPath.row];
   [self.aTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

在新项目中尝试你会得到它

您可以使用 UIViewController

实现此目标

UIViewController

中添加tableviewtableviewcell

我已经使用 swift 实现了同样的事情。它会让你知道如何在 Objective-C

中做

代码如下:

var data:[String] = ["One","Three","Four","Five","Six"]
@IBOutlet var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.rightBarButtonItem = self.editButtonItem()
    // Do any additional setup after loading the view, typically from a nib.
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel.text = self.data[indexPath.row]

    if editing
    {
        cell.imageView.image = UIImage(named: "Button-Delete-icon.png")
    }
    else
    {
        cell.imageView.image = UIImage(named: "")
    }
    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if editing
    {
        self.data.removeAtIndex(indexPath.row)
        self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
    }
}

override func setEditing(editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)
        self.tableView.reloadData()
}

希望对您有所帮助