Измените цвет кнопки удаления красного цвета по умолчанию в UITableViewCell при прокрутке строк или нажмите кнопку редактирования

Я хотел изменить цвет кнопки "минус" и кнопку "Удалить" UITableViewCell, когда вы нажмете на кнопку редактирования или прокрутите строки UITableView. Я уже реализовал этот код:

-(IBAction)doEdit:(id)sender
{

    [[self keyWordsTable] setEditing:YES animated:NO];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

}

Ответы

Ответ 1


iOS 8 и 9 (реквизит для этого сообщения)


Примечание. Если вы работаете с существующим проектом iOS 7, вам нужно обновить цель до iOS 8, чтобы получить эту функциональность. Также не забудьте установить UITableviewDelegate.

Все волшебство теперь происходит здесь (столько кнопок, сколько вам нужно!!!!):

 -(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewRowAction *button = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 1" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        NSLog(@"Action to perform with Button 1");
    }];
    button.backgroundColor = [UIColor greenColor]; //arbitrary color
    UITableViewRowAction *button2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Button 2" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
                                    {
                                        NSLog(@"Action to perform with Button2!");
                                    }];
    button2.backgroundColor = [UIColor blueColor]; //arbitrary color

    return @[button, button2];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// you need to implement this method too or nothing will work:

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


(iOS 7)


**activate the delete button on swipe**

// make sure you have the following methods in the uitableviewcontroller

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"You hit the delete button.");
    }

установить специальную текстовую метку вместо удаления.

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @"Your Label";
}

установить собственный цвет для кнопки часть 1 - предупреждение, это технически включает в себя выталкивание в частном яблочном API. Тем не менее, вам не запрещено изменять подзаголовок, используя общедоступный метод поиска, который является частью UIKIT.

Создайте класс uitableviewcell (см. также fooobar.com/questions/7745/...)

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        //iterate through subviews until you find the right one...
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                //your color
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
            }
        }
    }    
}

Другое примечание: нет гарантии, что этот подход будет работать в будущих обновлениях. Также будьте осторожны, что упоминание или использование частного класса UITableViewCellDeleteConfirmationView может привести к отказу AppStore.

установить пользовательский цвет для кнопки 2

обратно в ваш uitableviewcontroller

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    [YourTableView reloadData];
}

(Альтернативный цвет не будет вызываться до следующего вызова layoutSubviews на tablecell, поэтому мы гарантируем, что это произойдет, перезагрузив все.)

Ответ 2


Пример Swift (iOS 8)

UITableViewDelegate docs (editActionsForRowAtIndexPath)

Возвращаемое значение

Массив объектов UITableViewRowAction, представляющих действия для ряд. Каждое действие, которое вы предоставляете, используется для создания кнопки, пользователь может нажать.

Обсуждение

Используйте этот метод, если вы хотите предоставить настраиваемые действия для одна из ваших строк таблицы. Когда пользователь щелкает по горизонтали подряд, представление таблицы перемещает содержимое строки в сторону, чтобы выявить ваши действия. При нажатии одной из кнопок действия выполняется сохранение блока обработчика с объектом действия.

Если вы не реализуете этот метод, в представлении таблицы отображается стандартные кнопки аксессуаров, когда пользователь просматривает строку.

Рабочий пример в Swift:

@available(iOS 8.0, *)
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let button1 = UITableViewRowAction(style: .Default, title: "Happy!") { action, indexPath in
        print("button1 pressed!")
    }
    button1.backgroundColor = UIColor.blueColor()
    let button2 = UITableViewRowAction(style: .Default, title: "Exuberant!") { action, indexPath in
        print("button2 pressed!")
    }
    button2.backgroundColor = UIColor.redColor()
    return [button1, button2]
}

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
}

Ответ 3

время, когда вы вызываете willTransitionToState в .m(customcell)

- (void)willTransitionToState:(UITableViewCellStateMask)state{
    NSLog(@"EventTableCell willTransitionToState");
    [super willTransitionToState:state];
    [self overrideConfirmationButtonColor];
}

Проверить версию iOS, здесь, я использую iOS 7 - iOS8

//at least iOS 8 code here
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
        // iOS 8+ code here
        for(UIView *subview in view.subviews) {

            if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
                return subview;

            UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
            if(recursiveResult)
                return recursiveResult;
        }
    }

    else{
        // Pre iOS 8 code here
        for(UIView *subview in view.subviews) {
            if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
            UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
            if(recursiveResult) return recursiveResult;
        }
    }
    return nil;


}

-(void)overrideConfirmationButtonColor
{

    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
        if(confirmationButton)
        {
            UIColor *color = UIColorFromRGB(0xFF7373);
            confirmationButton.backgroundColor = color;

        }
    });
}

Ответ 4

Невозможно использовать открытый API.

Для кнопки удаления вы можете использовать пользовательскую реализацию, такую ​​как SWTableViewCell, чтобы изменить цвет кнопки, а также как добавить других.

Ответ 5

Старый вопрос, но я уверен, что есть люди, которые поддерживают iOS 7. Чтобы изменить цвет фона кнопки "Удалить", вам необходимо создать класс "UITableViewCell" или расширить его. то вы можете использовать

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        for(UIView *childView in subview.subviews){
            if ([childView isKindOfClass:[UIButton class]]) {
                childView.backgroundColor = [UIColor blueColor];
            }
        }
    }
}