以编程方式触发UITableViewCell“删除”按钮

时间:2013-03-18 15:41:02

标签: ios uitableview

我想在我的单元格上添加一个与刷卡到删除功能相同的自定义按钮。因此,当点击我的自定义按钮时,这个将被隐藏,让我们出现正式的红色“删除”按钮。

所以我做了类似的事情:

/// Controller.m
///
/// @brief Delete icon button pressed. Trigger display of Delete full button
///
- (IBAction)deleteDrug:(id)sender event:(id)event {
    NSIndexPath *indexPath = [self indexPathForButton:sender event:event];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell setEditing:YES animated:YES];
}

/// CustomCell.m
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];

    // hide / show "modify" button when entering in edit mode
    switch (editing) {
        case YES:
            self.deleteButton.hidden = YES;
            break;
        case NO:
            self.deleteButton.hidden = NO;
            break;
        default:
            break;
    }
}

此时,我的自定义按钮在点击时会隐藏,但官方的红色“删除”按钮没有出现。

有人知道如何处理这个问题吗?

3 个答案:

答案 0 :(得分:5)

我相信tableView会更多地处理删除按钮。因此,您可能需要让tableView知道它应该正在编辑,而不是设置您的单元格编辑。

- (IBAction)deleteDrug:(id)sender event:(id)event {
    selectedButtonIndex = [self indexPathForButton:sender event:event];

    [tableView setEditing:YES animated:YES];
}

所以你可能需要做一些事情,比如设置tableView进行编辑。然后在tableview的数据源中,您可以实现此方法,其中selectedButton是正确单元格的索引路径。

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

    return NO;
}

您可能需要为数据源实现此方法。

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

答案 1 :(得分:1)

我没有找到任何适当的解决方案,所以我自己做了。我制作了假删除按钮,它的工作方式与原始按钮非常相似。我在这里展示了棘手的删除按钮部分。

如果你想知道如何替换默认的减号(删除)编辑控件,有关于它的好文章,我建议:http://vinsol.com/blog/2015/01/06/custom-edit-control-for-uitableviewcell/

因此,假设您从文章中做了第一部分,并且您希望在按下自定义编辑控件按钮时看到删除按钮。代码在Swift上,但您可以使用相同的步骤在Objective-C

中进行此操作
func deleteButtonShow(){

    let deleteButton = UIButton(frame: CGRect(x: self.frame.width, y: 0, width: 80, height: self.frame.height))
    deleteButton.backgroundColor = UIColor.redColor() // ! note: original delete have another color
    deleteButton.setTitle("Delete", forState: UIControlState.Normal)
    deleteButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
    deleteButton.addTarget(self, action: "actionForDelete", forControlEvents: UIControlEvents.TouchUpInside)
    // action for your button will call delegate that will do the delete work. in most cases
    self.contentView.addSubview(deleteButton)

    var movedSubviews = self.subviews        
    var i = 0
    for subview in movedSubviews {
        // NOTE: I added tag = 1 in the storyboard to Content View of my cell
        if subview.tag == 1 {
            movedSubviews.removeAtIndex(i) // we don't need to move it.
            break
        }
        ++i
    }
    movedSubviews.extend(self.contentView.subviews)// add subviews from content view

    UIView.animateWithDuration(0.3, animations: { () -> Void in

        for movedView in movedSubviews as! [UIView]  {

            movedView.frame = CGRect(origin: CGPoint(x: movedView.frame.origin.x - 80, y: movedView.frame.origin.y), size: movedView.frame.size)
        //animate the things    
        }

    })


}

我们不想移动内容视图,因为我发现如果我们的按钮不在上面的内容视图中它是不可触及的,我有一些想法,但不确定。如果您知道原因,请在评论中添加此信息,我很想知道。

我还想注意,如果你像我一样使用autolayout,你需要更改动画中的约束,而不是它的框架,所以你可能不需要extend部分。

答案 2 :(得分:-3)

请执行此操作以使用UITableViewcell右侧的删除按钮。

- (void)tableView:(UITableView *)tableView 
        commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
        forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] 
                   withRowAnimation:UITableViewRowAnimationTop];
        [self.**yourarray** removeObjectAtIndex:indexPath.row];
        [tableView endUpdates];
        [tableView reloadData];
    }
}