UITableViewCell 不尊重 shouldIndentWhileEditing = NO?

Posted

技术标签:

【中文标题】UITableViewCell 不尊重 shouldIndentWhileEditing = NO?【英文标题】:UITableViewCell not respecting shouldIndentWhileEditing = NO? 【发布时间】:2014-08-09 20:43:17 【问题描述】:

当我将 UITableView 置于编辑模式时,我一直试图阻止 (-) 删除指示符出现。

为清晰起见更新:

这是表格的样子:

这是我在 - (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

当我点击重新排序时,我会进入编辑模式。我不希望这些显示:

我通过将editActionsForRowAtIndexPath 中显示的按钮限制为仅删除来解决第三个屏幕截图,但我什至不想进入这部分。我希望编辑模式仅重新排序

/更新

我试过设置 UITableViewCell.shouldIndentWhileEditing = NO

直接在单元格上:

cell.indentationLevel = -3;
cell.shouldIndentWhileEditing = NO;

在界面生成器中

在适当的委托方法中

- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
    
        NSLog(@"shouldIndentWhileEditingRowAtIndexPath");
        return NO;
    

我还显示了操作列表中的项目。我根本没有计划在编辑模式下删除,只是重新编码。我已经调整了一些东西,所以我只在用户滑动时显示删除,但我宁愿 (-) 根本不显示:

- (void) endEditing

    self.editMode = NO;
    self.editControlButton.title = @"Reorder";
    [self setEditing:NO animated:YES];
    //[self.tableView reloadData];


- (void) startEditing

    self.editMode = YES;
    self.editControlButton.title = @"Done";
    [self.tableView setEditing:YES animated:YES];


#pragma - mark UITableViewDelegate

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


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

    return UITableViewCellEditingStyleDelete;


- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath

    NSLog(@"shouldIndentWhileEditingRowAtIndexPath");
    return NO;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    TCORead *item = [self.fetchedResultsControllerDataSource selectedItem];
    manager.currentRead = item;


- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
        [self.tableView setEditing:NO];
    ];

    //workaround, rdar://17969970
    //normally don't want to be able to get into this menu when reordering
    if (!self.editMode) 
        UITableViewRowAction *shareAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"Share" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
            [self.tableView setEditing:NO];
        ];
        shareAction.backgroundColor = [UIColor grayColor];

        UITableViewRowAction *doneAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"Done" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
            [self.tableView setEditing:NO];
        ];
        doneAction.backgroundColor = [UIColor greenColor];

        [self startEditing];
        return @[deleteAction, doneAction, shareAction];
    

    return @[deleteAction];


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

    [self endEditing];


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    //empty on purpose

【问题讨论】:

当 tableView 进入编辑模式时,你到底想发生什么?如果不想出现删除按钮,为什么还要使用编辑模式? @Dan 谢谢,我已经用截图更新了这个问题。我正在使用编辑模式来允许重新排序。但是,可以处理编辑模式之外的删除 【参考方案1】:

我强制删除指示符出现。 Vanyas 有一个示例项目,它向我展示了我做错了什么。

我的 editingStyleForRowAtIndexPath 方法需要如下所示:

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

//return UITableViewCellEditingStyleDelete;
return tableView.isEditing ? UITableViewCellEditingStyleNone: UITableViewCellEditingStyleDelete;

【讨论】:

【参考方案2】:

如果您不想允许删除,只是重新排序,那么就不需要对缩进做任何事情。相反,只需这样做:

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

    return UITableViewCellEditingStyleNone;

并且根本不实现tableView:commitEditingStyle:forRowAtIndexPath: 方法。

你也避免从tableView:editActionsForRowAtIndexPath:返回deleteAction

这将防止行删除。您现在可以根据需要支持重新排序。

【讨论】:

如果我使用 UITableViewCellEditingStyleNone,我无法访问我在 editActionsForRowAtIndexPath 中定义的按钮。为了清楚我正在尝试做什么,我已经更新了屏幕截图。谢谢

以上是关于UITableViewCell 不尊重 shouldIndentWhileEditing = NO?的主要内容,如果未能解决你的问题,请参考以下文章

约束 UIImageView 高度以尊重 UITableViewCell 中的动态 UILabel 高度

UITableViewCell 子视图不遵守自动布局约束

UITableView 单元格中的图像不支持 tintColor

UIScrollView 中的 UIView 尊重一些约束,但不尊重其他约束

iframe 不尊重高度属性

为啥角度组件不尊重样式 css?