Программно запускать кнопку UITableViewCell "Удалить"

Я хотел бы добавить пользовательскую кнопку в своих ячейках, которая выполняет ту же функцию, что и функция удаления от ударов. Поэтому, когда вы нажимаете на свою пользовательскую кнопку, она будет скрыта, чтобы появилась официальная красная кнопка "Удалить".

Итак, я сделал что-то вроде этого:

/// 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;
    }
}

В этот момент моя пользовательская кнопка становится скрытой при нажатии на них, но официальная красная кнопка "Удалить" не появляется.

Кто-нибудь знает, как с этим справиться?

Ответ 1

Я считаю, что кнопка удаления больше обрабатывается 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;
}

Ответ 2

Я не нашел подходящего решения этого вопроса, поэтому я сделал свой собственный. Я сделал фальшивую кнопку удаления, и она очень похожа на оригинальную. Здесь я показываю сложную часть кнопки удаления.

Если вы хотите знать, как заменить элемент управления по умолчанию минус (удалить), есть хорошая статья об этом, я рекомендую: 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 часть.

Ответ 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];
    }
}