4

現在、UITableViewCell の削除ボタンをカスタマイズしようとしています。今、私はそのようなものを持っています:

ここに画像の説明を入力

今、必要なのは、このボタンの色を変更することだけです。動作を変更したり、完全にカスタムにしたりしたくありません。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];
        }
    }
}

どうすればこれを行うことができますか?

前もって感謝します!

4

6 に答える 6

5

UITableViewCellDeleteConfirmationControl はパブリック クラスではないため、その外観を簡単に変更することはできません。

そのためには、セルのサブビューを繰り返し処理し、そのプロパティを変更する必要があると思います。

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

もちろん、かなり壊れやすいので、この種のことを行うには注意が必要です。代わりに自分でロールすることをお勧めします。

これをもっと簡単に編集できるようにするには、Apple にバグ レポートを提出することをお勧めします。

于 2012-08-26T15:11:01.460 に答える
4

UITableViewCell サブクラスで:

- (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 で動作します

于 2014-07-28T08:42:20.757 に答える
2

方法は次のとおりです。

スワイプで削除ボタンを有効にする

// 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 のカスタム カラーを設定します - 警告、これには技術的にはプライベート Apple API の突っ込みが含まれます。ただし、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];
            }
        }
    }    
}

別の注意: このアプローチが将来の更新で機能するという保証はありません。また、privateUITableViewCellDeleteConfirmationViewクラスについて言及したり使用したりすると、AppStore で拒否される可能性があることに注意してください。

ボタン パーツ 2 のカスタム カラーを設定する

あなたのuitableviewcontrollerに戻ります

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

(代替色は、次に layoutSubviews がテーブルセルで呼び出されるまで呼び出されないため、すべてをリロードすることでこれが確実に行われるようにします。)

于 2014-03-14T04:36:53.383 に答える
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];
        }
    }
}
于 2012-08-26T15:34:03.893 に答える
1

IOS7 互換の回答 (カスタム クラスを作成するのではなく、 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
于 2014-03-12T11:58:41.270 に答える