2017-01-04 6 views
2

У меня есть таблица, которая использует выборки coredata для заполнения своего «я», контроллер выборки сохраняет действие строки удаления.Добавление действия «Редактировать строку» в TableView, в котором используется Fetch Controller?

Однако я хочу добавить функцию редактирования в строку, но я, похоже, не могу добавить это рядом с функцией удаления, которую я сейчас имею, и мне нужно использовать editActionsForRowAt, чтобы она появилась.

Когда я использую editActionsForRowAt, он переопределяет существующие действия над строками контроллера Fetch и заставляет удаление больше не работать.

Любая идея, как я могу добавить только редактирование рядом с существующим удалением без написания или возиться с контроллером результатов выборки?

Вот код для выборки контроллера, который является источником для таблицы и ее удаление дела и удалить FUNC, я хочу, чтобы в идеале добавить кнопку редактирования для этого, без необходимости переписывать все с 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

Из документации 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:) метод.

+0

Да, но, как я заявил в вопросе, используя это, перезаписывает функцию удаления контроллеров выборки, я предполагаю, что это происходит, чтобы скопировать код и вставить его в параметр editActionsForRowAt? – jwarris91

+0

@ jwarris91 Прочтите ответ еще раз, вы все еще не понимаете. –