UITableViewはスワイプを無効にして削除しますが、編集モードではまだ削除しますか?


91

行をスワイプで削除することはできませんが、編集モードで行を削除することはできますが、Alarmアプリと同様のものが必要です。

tableView:commitEditingStyle:forRowAtIndexPath:をコメントアウトしたとき、スワイプを無効にして削除しましたが、編集モードでは[削除]ボタンがありましたが、[削除]ボタンを押すとどうなりますか。何と呼ばれますか?

回答:


286

わかりました、とても簡単です。これは私がこれを解決するためにしたことです:

Objective-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

スウィフト2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

スウィフト3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

tableView:commitEditingStyle:forRowAtIndexPath:削除をコミットするには、まだ実装する必要があります。


buその後、スワイプして削除すると、再び自動的に有効になります。か否か?
マッシモカファロ

いいえ、編集モードでない場合、スワイプして削除することはできません。そのため、デフォルトとしてUITableViewCellEditingStyleNoneを返します。
willi

3
(editingStyle == UITableViewCellEditingStyleDelete)in commitEditingStyle:
willi

わかりました、このステートメントでは削除アクションを取得しましたが、見た目が異なります。スワイプバージョンと同じ視覚効果でそのアクションを実行する可能性はありますか?
Göktuğアラル

@giuseppe関係ありません。彼は自己に戻って言及することで間違っていません。そのデリゲートメソッドは同じtableViewを参照しているため、またはを使用しても問題ありません。
スティーブンポール

9

明確にするために、tableView:commitEditingStyle:forRowAtIndexPath:が実装されていない限り、スワイプして削除は有効になりません。

開発中は実装していなかったため、スワイプして削除できませんでした。もちろん、完成したアプリでは、常に実装されます。それ以外の場合、編集は行われません。


4

Swiftバージョン:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

CanEditRowAt関数を実装する必要があります。

EditingStyleForRowAt関数で.deleteを返すことができるため、編集モードでも削除できます。

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

2

基本的に、メソッドを使用して編集を有効または無効にします

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

編集が有効になっている場合、赤い削除アイコンが表示され、削除の確認がユーザーに要求されます。ユーザーが確認した場合、デリゲートメソッド

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

削除要求が通知されます。このメソッドを実装すると、スワイプで削除が自動的にアクティブになります。このメソッドを実装しない場合、スワイプして削除することはできませんが、実際に行を削除することはできません。したがって、私の知る限りでは、文書化されていないプライベートAPIを使用しない限り、要求したことを達成することはできません。おそらく、これがAppleアプリケーションの実装方法です。


1
これを解決するには、編集モードの場合、tableView:editingStyleForRowAtIndexPath:でUITableViewCellEditingStyleDeleteを返します。
willi

0

C#の場合:

スワイプで[削除]オプションを使用して行を有効/無効にする必要があるのと同じ問題がありました。複数の行を左にスワイプして削除する必要があり、それらを別の色に保ちます。私はこのロジックを使用して達成しました。

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

deletedIndexesは、重複することなくテーブルから削除されるインデックスのリストであることに注意してください。このコードは、行が削除されているかどうかを確認し、スワイプを無効にするか、その逆を行います。

同等のデリゲート関数はSwift is canEditRowAtIndexPathです。


0

私はこの問題にも遭遇し、以下のコードで修正しました。それがお役に立てば幸いです。

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

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.