当我们已经有一个单元格时,尝试设置滑动以删除单元格……这似乎不太好

Posted

技术标签:

【中文标题】当我们已经有一个单元格时,尝试设置滑动以删除单元格……这似乎不太好【英文标题】:attempting to set a swipe to delete cell when we already have one....that doesn't seem good 【发布时间】:2013-12-26 14:55:39 【问题描述】:

Cell 不允许删除它。当滑动发生时,它会向后滑动,因此无法删除它。控制台中的消息说:

attempting to set a swipe to delete cell when we already have one....
that doesn't seem good

代码:

#import "GroupDetailInfoViewController.h"
#import "YFJLeftSwipeDeleteTableView.h"

@interface GroupDetailInfoViewController ()


    NSMutableArray * _dataArray;
    UIButton * _deleteButton;
    NSIndexPath * _editingIndexPath;

    UISwipeGestureRecognizer * _leftGestureRecognizer;
    UISwipeGestureRecognizer * _rightGestureRecognizer;
    UITapGestureRecognizer * _tapGestureRecognizer;


@property (nonatomic, retain) YFJLeftSwipeDeleteTableView *tableView;
@end


@implementation GroupDetailInfoViewController

- (id)init

    self = [super init];
    if (self) 
        // Custom initialization
        _dataArray = [@[@(1), @(2), @(3), @(4), @(5), @(6), @(7), @(8), @(9), @(10)] mutableCopy];
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    CGRect frame = self.view.bounds;
    self.tableView = [[YFJLeftSwipeDeleteTableView alloc] initWithFrame:frame];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    [self.view addSubview:self.tableView];




#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 _dataArray.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"Data at Row %@", _dataArray[indexPath.row]];

    return cell;


// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

    // Return NO if you do not want the specified item to be editable.
    return YES;


// 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
        [_dataArray removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    



- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

    NSLog(@"willBeginEditingRowAtIndexPath");
    //[super setEditing:YES animated:YES];
    [self.tableView setEditing:YES animated:YES];

    //Self.editing handles the done / edit button
    tableView.editing = YES;


- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCellEditingStyle editingStyle = UITableViewCellEditingStyleNone;
    /*if (tableView.editing)*/ editingStyle = UITableViewCellEditingStyleDelete;

    return editingStyle;


- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath

    NSLog(@"didEndEditingRowAtIndexPath");
    //[super setEditing:NO animated:YES];
    [self.tableView setEditing:NO animated:YES];

    //Self.editing handles the done / edit button
    tableView.editing = NO;




- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
    return NO;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return 44;


@end

【问题讨论】:

那么到底是什么不工作?滑动单元格时是否不显示删除按钮?还是删除按钮没有删除单元格?还是? 刷卡时删除按钮不显示,实际上我有一个刷卡控制器,也有手势识别器,它们似乎有冲突 我认为在 tableView:willBeginEditingRowAtIndexPath: 中将表视图的编辑属性设置为 YES 是不正确的。滑动单元格的内部滚动视图时,表格视图应该已经将其编辑状态设置为 YES。注释掉所有修改表格视图编辑属性的代码会发生什么? 【参考方案1】:

添加 SWTableViewCell 后我遇到了同样的问题。在我已经实现 - (void)tableView:(UITableView)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath* 之后,我添加了 SWTableViewCell。

一旦我删除了这个方法,事情就按预期工作了。估计是SWTableViewCell安装的view和系统尝试基于这种方法安装同种view有冲突。

【讨论】:

【参考方案2】:

当我设置一个计时器并且每次触发计时器时都重新加载 tableView 时,我收到了相同的错误消息(在我的情况下,这是每秒一次)。在我编辑时删除计时器后,我不再收到错误。

【讨论】:

但是我没有计时器,问题是关于表格滑动和滑动控制器的冲突。【参考方案3】:

像 Karsten 一样,我也遇到了同样的问题,并且删除了系统方法 commitEditingStyle:forRowAtIndexPath 修复了它。但是,它现在阻止使用系统辅助功能操作菜单来允许通过辅助工具进行删除。

我在SWTableViewCell github 上添加了一个问题,希望他们能提出解决方案。

【讨论】:

以上是关于当我们已经有一个单元格时,尝试设置滑动以删除单元格……这似乎不太好的主要内容,如果未能解决你的问题,请参考以下文章

当用户没有完全滑动以删除表格视图单元格时,如何禁用/启用编辑按钮?

尝试滑动删除当前单元格时,表格视图单元格开始抖动

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图

只需一个手势滑动即可删除单元格

选择表格单元格时删除键盘

UITableView:滑动表格视图单元格时如何停止选择