将编辑行操作添加到使用Fetch Controller的TableView?

时间:2017-01-04 12:29:05

标签: ios swift uitableview core-data fetch

我有一个使用coredata fetch来填充其自身的表,fetch控制器存储删除行操作。

但是我想在行中添加一个编辑功能,我似乎无法在我目前拥有的删除功能旁边添加它,并且需要使用editActionsForRowAt来显示它。

当我使用editActionsForRowAt时,它会覆盖现有的Fetch Controllers行动作,并导致删除不再起作用。

我知道如何在现有删除旁边添加一个编辑而不会过度编写或弄乱获取结果控制器吗?

以下是fetch控制器的代码,它是表的源及其删除情况和删除函数,我想理想地为此添加一个编辑按钮,而不必使用editActionsForRowAt覆盖所有

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
        switch (type) {
        case .insert:
            if let indexPath = newIndexPath {
                workoutDesignerTable.insertRows(at: [indexPath], with: .fade)
            }
            break;
        case .delete:
            if let indexPath = indexPath {
                workoutDesignerTable.deleteRows(at: [indexPath], with: .fade)
            }
            break;
        case .update:
            if let indexPath = indexPath, let cell = workoutDesignerTable.cellForRow(at: indexPath) as? RoutineTableViewCell {
                configure(cell, at: indexPath)
            }
            break;
        default:
            print("...")
        }
    }

    // MARK: - DELETING TABLE ROW

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            let UserExercise = fetchedResultsController.managedObjectContext
            UserExercise.delete(self.fetchedResultsController.object(at: indexPath))
            do {
                try UserExercise.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

有关详细信息,请查看当前表行编辑操作的以下屏幕截图。

enter image description here

1 个答案:

答案 0 :(得分:2)

来自文档tableView(_:editActionsForRowAt:)

  

如果要为其中一个表行提供自定义操作,请使用此方法。当用户在一行中水平滑动时,表格视图会将行内容移到一边以显示您的操作。点击其中一个操作按钮会执行与操作对象一起存储的处理程序块。

     

如果您未实施此方法,则表格视图会在用户滑动行时显示标准附件按钮。

因此您还需要使用其他按钮传递删除操作按钮。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let btnEdit = UITableViewRowAction(style: .default, title: "Edit") { action, indexPath in
         //Put the code of edit action
    }
    let btnDelete = UITableViewRowAction(style: .destructive, title: "Delete") { action, indexPath in
         //Put the code of delete action
    }
    return [btnEdit, btnDelete]
}

注意:如果您要实施tableView(_:editActionsForRowAt:),则无需实施tableView(_:commit:forRowAt:)方法。