Swift CoreData 子モデル 保存処理と表示

子モデルを保存

ボタン押下時にcoredata保存処理

    @IBAction func btn_registration(_ sender: Any) {
 //入れ物をつくる       
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
//persistentContainerでインスタンス生成する事
        let plan = Plans(context: context)
        //小テーブルを入力値分作る
        let num:Int! = Int(planDays!.text!)

        for i in 0...num{
            let day = Days(context: context)
            day.day = Int64(i)
            //nssetにnsmutable型は詰め込めない CoreDataの参照はNSSet型
            plan.days_re = plan.days_re?.adding(day) as NSSet?
        }
        plan.name = planName.text
        //開始日付を取得して保存
        let date = Date()
//開始日の詰め込み
        plan.start_date = date
        do {
            try context.save()
        }catch{
            print(error)
        }
        dismiss(animated: true, completion: nil)
    }
    

続いて保存したcoredataを表示

//前画面から渡るモデル
  var plan: Plans?

//モデルに子がいるが、nssetクラスは順番が担保されない
    override func viewDidAppear(_ animated: Bool) {
//ソートする
        let sortDescriptor = NSSortDescriptor(key: "day", ascending: true)
//リレーションに対してソートかける
        planDays = plan?.days_re?.sortedArray(using: [sortDescriptor]) as! [Days]
        
        tableView_day.reloadData()
    }

//セルの数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //2019.4 エルビス演算子 左辺のオプショナルのアンラップ結果がnilのとき 右辺
        return planDays?.count ?? 0
   
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // セルを取得する
        let cell: DayListCell = tableView.dequeueReusableCell(withIdentifier: "DayCell", for: indexPath) as! DayListCell
        
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ja_JP")
        formatter.dateStyle = .medium
        // セルに表示する値を設定する

        let date = planDays![indexPath.row].day
        cell.count.text = "\(String(planDays![indexPath.row].day + 1)) 日目"
//Componentsとは構成要素の事
        let dateComponents = DateComponents(day: Int(date))
        //datecomponents でday を指定しているのでその分増えていく 引数1-足す時間 引数2-開始時間
        let showDay = Calendar.current.date(byAdding: dateComponents, to: plan!.start_date!)
        cell.dayLabel.text = formatter.string(from: showDay!)
        
        return cell
    }