Uitableview Swift 3-核心数据一对一关系获取值

Uitableview Swift 3-核心数据一对一关系获取值,uitableview,core-data,swift3,one-to-one,Uitableview,Core Data,Swift3,One To One,我的核心数据中有一对一的关系,使用UIAlertAction我保存了一些数据,并且成功地将其保存到核心数据中,没有错误 现在我想获取这些数据并将其设置为tableview中的UILabel 这是我的 使用editActionsForRowAt,我正在保存reps和set的值 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?

我的核心数据中有一对一的关系,使用UIAlertAction我保存了一些数据,并且成功地将其保存到核心数据中,没有错误

现在我想获取这些数据并将其设置为tableview中的UILabel

这是我的

使用editActionsForRowAt,我正在保存reps和set的值

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {


    let editButton = UITableViewRowAction(style: .normal, title: "Edit") { (rowAction, indexpath) in

        let sets = self.workout?.muscleList?[indexpath.row]



        let inputAlert = UIAlertController(title: "Sets", message: "Enter reps and sets", preferredStyle: .alert)
        inputAlert.addTextField { (textfield:UITextField) in
            textfield.placeholder = "Sets"
        }
        inputAlert.addTextField { (textfield:UITextField) in
            textfield.placeholder = "Reps"
        }

        inputAlert.addAction(UIAlertAction(title: "Save", style: .default, handler: { (action:UIAlertAction) in



            let setsTextField = inputAlert.textFields?.first
            let repsTextField = inputAlert.textFields?.last

            if repsTextField?.text != "" && setsTextField?.text != "" {
                print("results: ",(setsTextField?.text)!, " sets + ", (repsTextField?.text)!," reps")


                sets?.setAndrep?.sets = setsTextField?.text
                sets?.setAndrep?.reps = repsTextField?.text

                do{
                    try sets?.managedObjectContext?.save()
                    print("saved the sets and reps at row: ",indexpath.row)



                }catch{
                    print("Set and rep could not be added")
                }


                self.newMusclesTableView.reloadData()

            }
        }))

        inputAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
        self.present(inputAlert, animated: true, completion: nil)



    }



    let deleteButton = UITableViewRowAction(style: .destructive, title: "Delete") { (rowAction, indexpath) in
        self.deleteMuscle(at: indexPath)
    }
    deleteButton.backgroundColor = UIColor.red

    return [editButton,deleteButton]
}
在我的牢房里 我试图获取保存的值并将其设置为UILabel,但它似乎根本没有获取值

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)

        cell?.setsRepsLabel?.text = muscles.setAndrep?.sets ?? "did not get value"
    }


    return cell!
}
UILabel被设置为“未获取值”,这意味着它无法获取muscles.setAndrep?.sets


有人能帮我解释一下我做错了什么吗?

在我回答问题之前,给我一些提示:

  • 尽量减少行间距,以便一眼就能看到整个方法,这在很大程度上有助于可读性(您不必滚动或将眼睛看得太远,一次就可以看到整个方法)(如果您以后确实有一个方法太长,无法在没有任何行间距的屏幕上显示,则该方法通常是一个指示器,需要将其拆分为多个方法)
  • 它可能会帮助您将save操作中的代码提取到它自己的方法中,这样您就可以在其他可能希望保存它的地方重用代码,而且您的代码以这种方式更具可读性和模块化(谷歌单一责任原则,这是一种非常有用的编程方式,可以节省你以后调试东西的时间=])
e、 g:

您将在操作回调中调用此函数:

let setrep = self.workout?.muscleList?[indexpath.row]
let sets = inputAlert.textFields?.first?.text
let reps = inputAlert.textFields?.last?.text
saveSetAndRepToMuscleList(sets, reps, setrep)
  • 对于您的问题,您是否有更新/获取self.workout?肌肉列表的代码
这可能是您遇到问题的地方,因为您已经说过数据正在正确地保存到核心数据中,但没有显示在UI中。但也可能是因为您的变量在代码中发生了更改,但实际上没有保存到核心数据中。有一些工具可以读取核心数据数据库的内容,以便您进行检查,like

  • 您可能需要检查是否存在使用模型对象的上下文执行保存的问题

    try set?.managedObjectContext?.save()

就我个人而言,我设置了对moc(托管对象上下文)的单一引用,并使用moc调用save等。我通常获得moc的方式是,当创建控制器时,我从应用程序委托获得引用,或我创建的管理核心数据对象的类(某种CoreDataManager)

  • 查看本指南(请注意,该演讲已过时几年,但仍有助于正确理解概念)
  • 代码一直是最新的

我怀疑
setAndrep
关系为零。在编辑操作中,您需要创建一个
SetRep
对象,将正确的值分配给它的
set
reps
属性,然后将其分配给
set
setAndrep
属性。我尝试过,但应用程序崩溃了,可能是我在这么做你能告诉我你的方法是怎样的吗@pbasdf@pbasdf在控制台中,它显示结果:3个集合+8个重复在第1行保存集合和重复,这意味着它已成功执行了try set?.managedObjectContext?.save(),但在单元格中未显示
let setrep = self.workout?.muscleList?[indexpath.row]
let sets = inputAlert.textFields?.first?.text
let reps = inputAlert.textFields?.last?.text
saveSetAndRepToMuscleList(sets, reps, setrep)