12

スワイプして削除する機能と同じことを行うカスタムボタンをセルに追加したいと思います。したがって、カスタム ボタンをクリックすると、これが非表示になり、公式の赤い「削除」ボタンが表示されます。

だから私はそのようなことをしました:

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

現時点では、カスタム ボタンをクリックすると非表示になりますが、公式の赤い「削除」ボタンは表示されません。

誰かがこれを処理する方法を知っていますか?

4

3 に答える 3

5

削除ボタンは、tableView によってより多く処理されると思います。したがって、セルの編集を設定するのではなく、tableView に編集中であることを知らせる必要がある場合があります。

- (IBAction)deleteDrug:(id)sender event:(id)event {
    selectedButtonIndex = [self indexPathForButton:sender event:event];

    [tableView setEditing:YES animated:YES];
}

そのため、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;
}
于 2013-03-18T15:44:40.003 に答える
1

この質問に対する適切な解決策が見つからなかったので、自分で作成しました。偽の削除ボタンを作成しましたが、元のボタンとほとんど同じように機能します。ここでは、トリッキーな削除ボタンの部分を示します。

デフォルトのマイナス (削除) エディット コントロールを置き換える方法を知りたい場合は、それに関する素晴らしい記事があります。 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    
        }

    })


}

私たちのボタンがコンテンツ ビューの上にない場合は触れられないことがわかったので、コンテンツ ビューを移動したくありません。理由はいくつか考えられますが、よくわかりません。理由を知っている場合は、コメントにこの情報を追加してください。ぜひ知りたいです。

また、自動レイアウトを私のように使用する場合は、フレームではなくアニメーションの制約を変更する必要があるため、extend一部は必要ない可能性があることに注意してください。

于 2015-08-27T20:03:11.670 に答える