Вопрос по uitableview, ios, customization, objective-c – Изменение цвета UITableViewCellDeleteConfirmationControl (кнопка «Удалить») в UITableViewCell

4

В настоящее время я пытаюсь настроить кнопку delte в UITableViewCell. Теперь у меня есть что-то вроде этого:

enter image description here

Теперь все, что мне нужно, это изменить цвет этой кнопки, я не хочу менять ее поведение или сделать ее совершенно индивидуальной. Я уверен, что это возможно без создания собственных элементов управления для удаления строк в UITableView.

Это мой код:

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
            deleteButtonView.backgroundColor = [UIColor greenColor];
        }
    }
}

How could I do this?

Заранее спасибо!

@DrummerB Я много читал о настройке этой кнопки, очевидно, моя ячейка настроена, я уже подклассифицирую UITableViewCell, но я не понимаю, как просто изменить цвет, большую часть времени люди хотят изменить анимацию или весь вид этой кнопки. Anatoliy Gatt
Я не думаю, что это возможно без пользовательского подкласса UITableViewCell. Почему вы уверены, что это возможно? DrummerB
@DrummerB Я не хочу менять поведение, только цвет. Anatoliy Gatt
Я не знаю ни одного (задокументированного) способа доступа к этой кнопке. Единственный способ настроить его - установить его текст. Вы могли бы попытаться перебрать все подпредставления ячейки и попытаться найти кнопку (очень плохое и негибкое решение!), Но даже если вы найдете ее, UIButton не имеет свойства оттенка. Вы должны создать свое тонированное растягиваемое фоновое изображение в выбранной вами программе для редактирования изображений. DrummerB

Ваш Ответ

6   ответов
4

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    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) confirmationButton.backgroundColor = [UIColor orangeColor];
    });
}

Затем в UITableViewDelegate:

-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    <#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath];
    [cell overrideConfirmationButtonColor];
}

Это работает в iOS 7.1.2

Потрясающие! отлично работает для меня
1

а расширение UITableViewCell:

@implementation UITableViewCell (customdelete)
- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
        for(UIView *subview2 in subview.subviews){
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
                ((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED;
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT
            }
        }
    }
}
@end
Этот подход работает. Однако вам может потребоваться добавить это в UITableViewController, чтобы пользовательский цвет отображался ... - (void) tableView: (UITableView *) tableView willBeginEditingRowAtIndexPath: (NSIndexPath *) indexPath {[self.yourTableView reloadData]; }
у меня не работает
он не работает после ios 7.1.2
2

activate the delete button on swipe

// убедитесь, что у вас есть следующие методы в 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.");
}

set custom text label instead of delete.

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

set custom color for button part 1 - warning, this technically involves poking at the private apple API. However, you are not prevented from modifying a subview using a public method search that is part of UIKIT.

Создайте класс uitableviewcell (см. Такжеhttps://stackoverflow.com/a/22350817/1758337 )

- (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.

set custom color for button part 2

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

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

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

2

8, и она больше не работает должным образом.

Теперь вам нужно найти подпредставление & quot;_UITableViewCellActionButton& Quot; и установить цвет фона этого.

Ниже приведена модифицированная версия кода silyevsk'а, которую я использовал в своем приложении.

Наsome из моегоUITableView я не хотел, чтобы пользователь имел возможность провести пальцем, чтобы удалить, но яdid хотите, чтобы что-то (значок замка) появилось, когда они сильно ударили.

enter image description here

Для этого я добавилbReadOnly переменная для моего класса UITableViewCell

@interface NoteTableViewCell : UITableViewCell

. . . 

@property (nonatomic) bool bReadOnly;

-(void)overrideConfirmationButtonColor;

@end

и я добавил код Сильевска в мой файл .m:

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
    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;
    }
    return nil;
}

-(void)overrideConfirmationButtonColor
{
    if (!bReadOnly)
        return;

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

            UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame];
            imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"];
            imgPadLock.contentMode = UIViewContentModeCenter;     //  Don't stretch the UIImage in our UIImageView

            //  Add this new UIImageView in the UIView which contains our Delete button
            UIView* parent = [confirmationButton superview];
            [parent addSubview:imgPadLock];
        }
    });
}

Кроме того, мне нужно было изменить код, который заполняетUITableViewв противном случае & quot; Удалить & quot; метка будет отображаться так же, как и значок замка:

-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Note* note = [listOfNotes objectAtIndex:indexPath.row];
    if ( /* Is the user ,is allowed to delete this cell..? */ )
        return @"Delete";

    return @"      ";
}

Это все еще уродливо и основано на предположениях, что все это не изменится, когда выйдет iOS 9.

1


- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
            UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]];
            [deleteButtonView addSubview:image];
        }
    }
}
Этот подход необходимо изменить для iOS 7. Смотрите мой ответ выше, а такжеstackoverflow.com/a/22350817/1758337
5

и вы не можете легко изменить его внешний вид.

Я полагаю, что для этого вам нужно перебрать подпредставления ячейки и изменить ее свойства:

for (UIView *subview in self.subviews) {
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") {
        // Set the background using an image.
    }
}

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

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

Но я не вижу никаких результатов, даже когда я пытаюсь добавить подпредставление, такое как кнопка, оно не сделает этого, но UILabel прекрасно вписывается в него. Anatoliy Gatt
О, я наконец нашел решение, теперь я выложу код) Anatoliy Gatt
Я бы обновил сообщение сейчас, чтобы вы могли видеть, что я сделал. Anatoliy Gatt

Похожие вопросы