web-dev-qa-db-ja.com

UITableViewセルの編集時にカスタム削除ボタン

私は この質問 を通過しました。これは次のコードを示しています。

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

デフォルトの赤いボタンの代わりにカスタム画像が必要な場合はどうなりますか?

25

luvieereは正しい-同じ「削除」メタファーが必要な場合は、Appleが提供する赤いボタンに留めておきたい。なぜ変更するのか?標準削除ボタン用。

完全にスワイプの動作を変更するTweetieのようなものが必要な場合でも、独自のビューで描画するだけのABTableViewCellのようなものを使用できます。カスタムテーブルビューを作成し、-touchesBegan:withEvent:をオーバーライドして、タッチを確認します。 2つのタッチの差分を計算し(touchesMoved:withEvent:内)、独自のビューを移動します。

0
Saurabh Sharan

このメソッドをカスタムセルに実装する

- (void)willTransitionToState:(UITableViewCellStateMask)state{
    [super willTransitionToState:state];
    if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask) {
        for (UIView *subview in self.subviews) {
            if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
                UIImageView *deleteBtn = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 64, 33)];
                [deleteBtn setImage:[UIImage imageNamed:@"delete.png"]];
                [[subview.subviews objectAtIndex:0] addSubview:deleteBtn];
                [deleteBtn release];
            }
        }
    }
}
34
user1684899

これは返信が遅いですが、誰かがこれが役に立てば幸いです。だから、受け入れられた答えは私にとってちょっと複雑に思われ、@ user1684899の答えは、削除ボタンの外観を変更したい場合にのみ機能します。削除ボタンの外観(フレーム、位置など)を完全に変更したいので、私の解決策は、独自の削除ボタンをカスタムセルに追加し、最初は非表示のままにし、セルが表示されているときにのみ表示することです編集モード。さらに重要なのは、iOSの元の削除ボタンを非表示にし、下位互換性をサポートすることです。これが私のトリックです。

- (void)willTransitionToState:(UITableViewCellStateMask)state
{
    [super willTransitionToState:state];
    if ((state & UITableViewCellStateShowingDeleteConfirmationMask) == UITableViewCellStateShowingDeleteConfirmationMask)
    {
        if (!IS_IOS_7){
            for (UIView *subview in self.subviews)
            {
                if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"])
                {
                    // hide original button
                    [[subview.subviews objectAtIndex:0] setHidden:YES];
                    // show my custom button
                    [self.deleteButton setHidden:NO];
                }
            }

        } else {
            for (UIView *subview in self.subviews) {
                for (UIView *subview2 in subview.subviews) {
                    if ([NSStringFromClass([subview2 class]) rangeOfString:@"Delete"].location != NSNotFound) {
                        // hide original button
                        [subview2 setHidden:YES];
                        // show my custom button
                        [self.deleteButton setHidden:NO];
                    }
                }
            }
        }
    } else {
        // hide my custom button otherwise
        [self.deleteButton setHidden:YES];
    }
}

そして追加することを忘れないでください:

[cell.deleteButton addTarget:self action:@selector(deleteEntryAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];

cellForRowAtIndexPathでは、削除ボタンをクリックしたときに必要なものを追加できます。これが私の結果です:

enter image description here

7
huong

ルビエールの回答に関するコメントで述べたように、目的のリストダイブインアクションのシステム全体の標準は、スワイプジェスチャーではなく、詳細開示(青い円の矢印)セルアクセサリーを使用することです。

とはいえ、スワイプアクションを引き続き使用する場合は、トゥイーティーのように手動でスワイプジェスチャをインターセプトして完全に再実装しない限り、独自のボタンを提供する方法はありません。

1
Marco