web-dev-qa-db-ja.com

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

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

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

88
willi

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

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
}

Swift

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

    return .none
}

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

281
willi

明確にするために、スワイプから削除まではtableView:commitEditingStyle:forRowAtIndexPath:が実装されています。

開発中は実装しなかったため、削除するスワイプは有効になりませんでした。もちろん、完成したアプリでは、常に編集が行われるため、常に実装されます。

9
Marc Rochkind

迅速なバージョン:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
4
kareem

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

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

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

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

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

2
Massimo Cafaro

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
}
1
Noodybrank

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
A.G

私はこの問題に遭遇し、以下のコードで修正しました。それがあなたを助けることを願っています。

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

}

0
user4272677