8

我实施editActionsForRowAtIndexPath并且commitEditingStyle滑动正在工作,但没有编辑操作出现在UITableViewCell

editActionsForRowAtIndexPath我的实现commitEditingStyle如下:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == UITableViewCellEditingStyle.Delete {
            //I did some work here
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
        }
    }


 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?  {

    let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
        //I did some work here
        tableView.reloadData()
    })


    return [deleteAction]
}

任何帮助将不胜感激

4

6 回答 6

9

我想你在这里混合了两种不同的编辑。

第一种编辑是旧的UITableViewCellEditingStyle.Delete。新方法是提供您的自定义附件视图。

如果您实现自定义附件视图,则不会显示默认的删除按钮,因此不会被调用。所以你的

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)

从我的角度来看,甚至可能不会被调用。

Apple 的文档 ForeditActionsForRowAtIndexPath 包含以下句子:If you do not implement this method, the table view displays the standard accessory buttons when the user swipes the row.我假设如果您确实实现了此方法,则不会显示标准附件视图。

编辑:代码示例(更新到 Swift 3 11/17/16)

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

private func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: IndexPath) -> [AnyObject]? {
    let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.normal, title: "Delete" , handler: { (action:UITableViewRowAction, indexPath:IndexPath) -> Void in
    })
    return [deleteAction]
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

}

编辑 2:正如 rajagp 指出的那样,如果您只针对 iOS9(或更高版本),则不需要空实现。

于 2015-06-23T14:14:30.717 回答
3

您需要从 UITableview 委托方法实现canEditRowAtIndexPath并返回 true。

于 2015-06-23T13:29:47.987 回答
1

很抱歉唤醒了这么一个旧线程,但我让它在 Swift 3 上运行:

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    return .delete
}
于 2017-08-01T08:59:51.870 回答
1

尝试在删除按钮内添加一些操作

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?
    {
        let delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
            let alertView = UIAlertController(title: "Delete Action", message: "", preferredStyle: UIAlertControllerStyle.Alert)
            alertView.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
            UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertView, animated: true, completion: nil)

        })
        delete.backgroundColor = UIColor.redColor()


        let more = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
            let alertView = UIAlertController(title: "More Action", message: "", preferredStyle: UIAlertControllerStyle.Alert)
            alertView.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
            UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertView, animated: true, completion: nil)
        })
        more.backgroundColor = UIColor.blueColor()

        return [delete, more]
    }
于 2015-09-11T10:00:56.290 回答
1

TLDR:

需要实现的函数: • commitEditingStyle • canEditRowAt • editActionsForRowAt

注意:因为editActionsForRowAt你不能在这里返回一个空数组——它会搞砸所有的单元格。如果存在您不想允许对其进行编辑操作的特定类型的行,请在其中指定此项canEditRowAt以对该类型的单元格返回 false。

于 2017-06-04T04:12:08.283 回答
0

我刚刚复制了显示行操作按钮并运行良好的 ViewController,并替换了滑动时不显示行操作按钮的视图控制器,现在显示了行操作按钮并执行了预期的行为。

但我不明白这个问题。有人能解释一下吗?

于 2015-06-25T18:16:45.590 回答