web-dev-qa-db-ja.com

スワイプを有効にしてTableViewのセルを削除するにはどうすればよいですか?

_ TableViewsデリゲートとデータソースを実装するUIViewControllerプロトコルがあります。次に、セルに「削除するスワイプ」ジェスチャーを追加します。

どうすればいいですか。

commitEditingStyleメソッドの実装を空にして、EditingプロパティをYESに設定しました。

それでもスワイプ機能は来ていません。

ここで、各セルにUISwipeGestureを個別に追加する必要がありますか?

それとも私は何かが欠けていますか?

74

セルスワイプで[削除]ボタンを表示する必要がある場合は、editing:YESを設定する必要はありません。 tableView:canEditRowAtIndexPath:を実装し、編集/削除が必要な行に対してそこからYESを返す必要があります。 tableViewのdataSourceがUITableViewContollerのサブクラスである場合、これは必要ありません-このメソッドは、オーバーライドされない場合、デフォルトでYESを返します。それ以外の場合はすべて実装する必要があります。

EDIT:一緒に問題を発見しました-テーブルが編集モードでない場合、tableView:editingStyleForRowAtIndexPath:UITableViewCellEditingStyleNoneを返しました。

53
Kyr Dunenkoff

Dan が上記でコメントしたように、次のテーブルビューデリゲートメソッドを実装する必要があります。

  1. tableView:canEditRowAtIndexPath:
  2. tableView:commitEditingStyle:forRowAtIndexPath:

注:iOS 6およびiOS 7でこれを試しました。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return YES - we will be able to delete all rows
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Perform the real delete action here. Note: you may need to check editing style
    //   if you do not perform delete only.
    NSLog(@"Deleted row.");
}
61
Dj S
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}



// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
25
Can Aksoy

Swiftでこのコードを試してください。

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
   // let the controller to know that able to edit tableView's row 
   return true
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)  {
   // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?  {
   // add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
   let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in

   // Your delete code here.....
   .........
   .........
   })

   // You can set its properties like normal button
   deleteAction.backgroundColor = UIColor.redColor()

   return [deleteAction]
}
13
Masa S-AiYa

次をクラスに追加してみてください。

// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return(YES);
}
5
David M. Syzdek

Kyr Dunenkoff chatの結論は

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

}

スワイプ時に削除ボタンを表示する必要がある場合は定義しないでください。

3
Thiru

NSFetchedResultsControllerDelegateを使用してテーブルビューを作成している場合、これはうまくいきました。

  • 確認してください tableView:canEditRowAtIndexPathは常にtrueを返します
  • あなたのtableView:commitEditingStyle:forRowAtIndexPath実装、テーブルビューから行を直接削除しないでください。代わりに、管理オブジェクトコンテキストを使用して削除します。例:

    if editingStyle == UITableViewCellEditingStyle.Delete {
        let Word = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Word
        self.managedObjectContext.deleteObject(Word)
        self.saveManagedObjectContext()
    }
    
    func saveManagedObjectContext() {
        do {
            try self.managedObjectContext.save()
        } catch {
            let saveError = error as NSError
            print("\(saveError), \(saveError.userInfo)")
        }
    }
    
1
GabeV

私の経験では、スワイプが機能するためには、editingUITableViewNOに設定する必要があるようです。

self.tableView.editing = NO;

0
kgaidis

これも私にとっては問題でした... 10回かそこらの試行ごとに一度だけスワイプして削除することができました。テレビのgestureが親View Controllerの別のジェスチャーによってブロックされていたことがわかりました。テレビはMMDrawerController(スワイプ可能な引き出しレイアウト)にネストされました。

引き出しコントローラーのジェスチャレコグナイザーを、側面の引き出しの閉じるジェスチャに応答しないように設定するだけで、スワイプで削除してテレビで機能させることができました。

gesture delegateを使用して、次のようなことを試すこともできます。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
0
Kevin

これはSwiftバージョンです

// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return NO if you do not want the specified item to be editable.
    return true
}

// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } else if editingStyle == .Insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}
0
JZAU

IOS 8.0以降では、アクションをカスタマイズできます

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
0
user501836