Uitableview Swift 3-重新排列并保留tableview中的单元格

Uitableview Swift 3-重新排列并保留tableview中的单元格,uitableview,core-data,swift3,drag-and-drop,Uitableview,Core Data,Swift3,Drag And Drop,我有一个tableview,我可以向其中添加项目,它将保存到核心数据,我还可以删除这些项目,一切正常 但是现在我想重新排列单元格并保存数据 此时,我可以选择barbutton编辑,它将允许我重新排列单元格,但当我离开viewcontroller时,它将重置为原来的状态 有人能帮我吗 class CustomWorkoutViewController: UIViewController { @IBOutlet weak var newMusclesTableView: UITableView!

我有一个tableview,我可以向其中添加项目,它将保存到核心数据,我还可以删除这些项目,一切正常

但是现在我想重新排列单元格并保存数据 此时,我可以选择barbutton编辑,它将允许我重新排列单元格,但当我离开viewcontroller时,它将重置为原来的状态

有人能帮我吗

class CustomWorkoutViewController: UIViewController {


@IBOutlet weak var newMusclesTableView: UITableView!

var workout:Workout?


override func viewDidLoad() {
    super.viewDidLoad()

    newMusclesTableView.delegate = self

    let nib = UINib(nibName: "muscleListTableViewCell", bundle: nil)
    newMusclesTableView.register(nib, forCellReuseIdentifier: "workCell")

}

override func viewDidAppear(_ animated: Bool) {
    self.newMusclesTableView.reloadData()
}



override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "addMuscles"{
        guard let destination = segue.destination as? AddMusclesViewController else {
            return
        }
        destination.workout = workout

    }

    else if segue.identifier == "addLogs"{
        guard let destination = segue.destination as? WorkoutViewController,
            let selectedRow = self.newMusclesTableView.indexPathForSelectedRow?.row else {
                return
        }
        destination.muscleLog = workout?.muscleList?[selectedRow]
    }


}

func btnAction(_ sender: UIButton) {

    let point = sender.convert(CGPoint.zero, to: newMusclesTableView as UIView)
    let indexPath: IndexPath! = newMusclesTableView.indexPathForRow(at: point)

    let vc = viewMusclesViewController()
    let viewTitle = workout?.muscleList?[indexPath.row]

    vc.customInit(title: (viewTitle?.name)!)
    vc.titleStr = viewTitle?.name
    vc.gifStr = viewTitle?.muscleImage
    navigationController?.pushViewController(vc, animated: true)

}

@IBAction func editAction(_ sender: UIBarButtonItem) {

    self.newMusclesTableView.isEditing = !self.newMusclesTableView.isEditing
    sender.title = (self.newMusclesTableView.isEditing) ? "Done" : "Edit"

}


func deleteMuscle(at indexPath: IndexPath){
    guard let muscles = workout?.muscleList?[indexPath.row],
        let managedContext = muscles.managedObjectContext else{
            return
    }
    managedContext.delete(muscles)

    do{
        try managedContext.save()

        newMusclesTableView.deleteRows(at: [indexPath], with: .automatic)
    }catch{
        print("Could not save")
        newMusclesTableView.reloadRows(at: [indexPath], with: .automatic)
    }
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}
这是我的tableview扩展

extension CustomWorkoutViewController: UITableViewDelegate,UITableViewDataSource {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return workout?.muscleList?.count ?? 0
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 70
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = newMusclesTableView.dequeueReusableCell(withIdentifier: "muscleCell", for: indexPath) as? muscleListTableViewCell

    cell?.cellView.layer.cornerRadius = (cell?.cellView.frame.height)! / 2


    if let muscles = workout?.muscleList?[indexPath.row]{
        cell?.muscleTitle?.text = muscles.name
        cell?.myBtn.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

    }


    return cell!
}


func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete{
        deleteMuscle(at: indexPath)
    }
}

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

func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {

//How to persist data here?

}

}

您的代码决定使用此代码的行显示哪个项目:

if let muscles = workout?.muscleList?[indexPath.row]
行顺序将由
muscleList
中的顺序决定。使用编辑模式时,表格视图可以重新排列单元格,但它无法保存新的顺序,因为它不知道如何更改
muscleList
的顺序。您的
tableView(uu:moveRowAt:to:)
实现需要根据表视图更新更改顺序


如果
muscleList
是有序关系,请更改顺序。如果它不是一个有序的关系,那么您需要添加一个属性,您可以使用该属性对关系进行排序,甚至像
排序器那样简单的属性也可以
如果有人需要帮助,我会把它贴在这里

func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    let muscle = workout?.muscleList?[sourceIndexPath.row]
    workout?.removeFromRawMuscles(at: sourceIndexPath.row)
    workout?.insertIntoRawMuscles(muscle!, at: destinationIndexPath.row)

    do{
        try muscle?.managedObjectContext?.save()


    }catch{
        print("Rows could not be saved")
    }
}

我就是这么说的。:)