_ TableViewsデリゲートとデータソースを実装するUIViewController
プロトコルがあります。次に、セルに「削除するスワイプ」ジェスチャーを追加します。
どうすればいいですか。
commitEditingStyle
メソッドの実装を空にして、EditingプロパティをYESに設定しました。
それでもスワイプ機能は来ていません。
ここで、各セルにUISwipeGesture
を個別に追加する必要がありますか?
それとも私は何かが欠けていますか?
セルスワイプで[削除]ボタンを表示する必要がある場合は、editing:YES
を設定する必要はありません。 tableView:canEditRowAtIndexPath:
を実装し、編集/削除が必要な行に対してそこからYESを返す必要があります。 tableViewのdataSourceがUITableViewContollerのサブクラスである場合、これは必要ありません-このメソッドは、オーバーライドされない場合、デフォルトでYESを返します。それ以外の場合はすべて実装する必要があります。
EDIT:一緒に問題を発見しました-テーブルが編集モードでない場合、tableView:editingStyleForRowAtIndexPath:
はUITableViewCellEditingStyleNone
を返しました。
Dan が上記でコメントしたように、次のテーブルビューデリゲートメソッドを実装する必要があります。
tableView:canEditRowAtIndexPath:
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.");
}
// 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
}
}
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]
}
次をクラスに追加してみてください。
// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return(YES);
}
Kyr Dunenkoff chatの結論は
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
}
スワイプ時に削除ボタンを表示する必要がある場合は定義しないでください。
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)")
}
}
私の経験では、スワイプが機能するためには、editing
のUITableView
をNO
に設定する必要があるようです。
self.tableView.editing = NO;
これも私にとっては問題でした... 10回かそこらの試行ごとに一度だけスワイプして削除することができました。テレビのgesture
が親View Controllerの別のジェスチャーによってブロックされていたことがわかりました。テレビはMMDrawerController
(スワイプ可能な引き出しレイアウト)にネストされました。
引き出しコントローラーのジェスチャレコグナイザーを、側面の引き出しの閉じるジェスチャに応答しないように設定するだけで、スワイプで削除してテレビで機能させることができました。
gesture delegate
を使用して、次のようなことを試すこともできます。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
これは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
}
}
IOS 8.0以降では、アクションをカスタマイズできます
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath