2016-11-25 5 views
0

私はエクササイズをコアデータに保存してテーブルに呼び出していますが、これはユーザー入力からテーブルに情報を持ち運ぶという点では機能しますが、コアデータは保持されないので、アプリケーションを開くとエントリが失われます。CoreDataは保持されませんか?

実際には昨日働いていたし、壊れているようだが、これを私の知る限り変更することはできない。デバッグ時に私が見つけたのは、アプリケーションをロードしたときにコンソールのSQLデータベースを指すことを意図したものですが、.configurationprofilesファイルに変更されました。これが原因であり、修正点は何でしょうか?私は、情報フローを示すために、テーブルビューのコードと下のユーザー入力フォームのコードを含めます。他のデータを追加する必要があるかどうかを教えてください。

enter image description here

import Foundation 
import UIKit 
import CoreData 

class ExerciseEditorController: UIViewController, UITextFieldDelegate { 

    var managedObjectContext: NSManagedObjectContext? 

    var userRepsCount = Int() 
    var userSetsCount = Int() 

    @IBOutlet weak var userExerciseName: UITextField! 
    @IBOutlet weak var userExerciseSetCounter: UILabel! 
    @IBOutlet weak var userExerciseRepsCounter: UILabel! 
    @IBOutlet weak var userExerciseWeight: UITextField! 

    @IBAction func userSetsStepper(_ sender: UIStepper) { 
     userExerciseSetCounter.text = Int(sender.value).description 
     self.userSetsCount = Int(sender.value) 
    } 

    @IBAction func userRepsStepper(_ sender: UIStepper) { 
     userExerciseRepsCounter.text = Int(sender.value).description 
     self.userRepsCount = Int(sender.value) 
    } 

    @IBAction func cancelExerciseEditor(_ sender: Any) { 
     self.performSegue(withIdentifier: "unwindToWorkoutDesignerWithSegue:", sender: self) 
    } 

    @IBAction func saveExerciseToWorkout(_ sender: Any) { 

     createExercise() 
     self.performSegue(withIdentifier: "unwindToWorkoutDesignerWithSegue:", sender: self) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = (UIColor.customBackgroundGraphite()) 

     userExerciseSetCounter.text = String(userSetsCount) 
     userExerciseRepsCounter.text = String(userSetsCount) 
     userExerciseWeight.delegate = self 
     userExerciseWeight.keyboardType = .numbersAndPunctuation 

    } 

    func createExercise() { 
     let userExerciseWeightSet = Double(self.userExerciseWeight.text!) //make this safe! 

     guard let managedObjectContext = managedObjectContext else { return } 

     let userExercise = UserExercise(context: managedObjectContext) 

     userExercise.name = userExerciseName.text 
     userExercise.sets = Int64(userSetsCount) 
     userExercise.reps = Int64(userRepsCount) 
     userExercise.weight = userExerciseWeightSet! //make this safe! 
     userExercise.createdAt = Date().timeIntervalSince1970 

    } 

    func animateTextField(textField: UITextField, up: Bool) { 
     let movementDistance:CGFloat = -130 
     let movementDuration: Double = 0.3 
     var movement:CGFloat = 0 
     if up { 
      movement = movementDistance 
     } 
     else { 
      movement = -movementDistance 
     } 

     UIView.beginAnimations("animateTextField", context: nil) 
     UIView.setAnimationBeginsFromCurrentState(true) 
     UIView.setAnimationDuration(movementDuration) 
     self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement) 
     UIView.commitAnimations() 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     self.animateTextField(textField: textField, up:true) 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
     self.animateTextField(textField: textField, up:false) 
    } 

} 

そして、これはテーブルビューです:

import Foundation 
import UIKit 
import CoreData 

class WorkoutDesignerController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { 

    @IBAction func unwindToWorkoutDesigner(segue: UIStoryboardSegue) {} 
    @IBOutlet weak var workoutDesignerTable: UITableView! 
    @IBOutlet weak var tapToAddExercise: UILabel! 
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView! 
    @IBAction func cancelWorkoutDesigner(_ sender: Any) { 
     self.performSegue(withIdentifier: "unwindToTemplatesWithSegue", sender: self) 
    } 

    private let persistentContainer = NSPersistentContainer(name: "Lift") 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupView() 
     workoutDesignerTable.delegate = self 
     workoutDesignerTable.dataSource = self 

     view.backgroundColor = (UIColor.customBackgroundGraphite()) 

     persistentContainer.loadPersistentStores { (persistentStoreDescription, error) in 
      if let error = error { 
       print("Unable to Load Persistent Store") 
       print("\(error), \(error.localizedDescription)") 

      } else { 
       self.setupView() 

       do { 
        try self.fetchedResultsController.performFetch() 
       } catch { 
        let fetchError = error as NSError 
        print("Unable to Perform Fetch Request") 
        print("\(fetchError), \(fetchError.localizedDescription)") 
       } 

       self.updateView() 
      } 
     } 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     guard let userExercises = fetchedResultsController.fetchedObjects else { return 0 } 
     return userExercises.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? RoutineTableViewCell else { 
      fatalError("Unexpected Index Path") 
     } 

     cell.backgroundColor = UIColor.customBackgroundGraphite() 
     cell.textLabel?.textColor = UIColor.white 

     let userExercise = fetchedResultsController.object(at: indexPath) 

     cell.nameLabel.text = userExercise.name 
     cell.repsLabel.text = String(userExercise.reps) 
     cell.setsLabel.text = String(userExercise.sets) 
     cell.weightLabel.text = String(userExercise.weight) 

     return cell 
    } 

    private func setupView() { 
     setupMessageLabel() 
     updateView() 
    } 

    private func setupMessageLabel() { 
     tapToAddExercise.text = "Tap + To Add An Exercise To The Routine" 
    } 

    fileprivate func updateView() { 
     var hasUserExercises = false 
     if let UserExercise = fetchedResultsController.fetchedObjects { 
      hasUserExercises = UserExercise.count > 0 
     } 
     workoutDesignerTable.isHidden = !hasUserExercises 
     tapToAddExercise.isHidden = hasUserExercises 

     activityIndicatorView.stopAnimating() 
    } 

    fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExercise> = { 

     // Create Fetch Request 
     let fetchRequest: NSFetchRequest<UserExercise> = UserExercise.fetchRequest() 

     // Configure Fetch Request 
     fetchRequest.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: true)] 

     // Create Fetched Results Controller 
     let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.persistentContainer.viewContext, sectionNameKeyPath: nil, cacheName: nil) 

     // Configure Fetched Results Controller 
     fetchedResultsController.delegate = self 

     return fetchedResultsController 
    }() 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "addNewExerciseSegue" { 
      if let destinationViewController = segue.destination as? ExerciseEditorController { 
       // Configure View Controller 
       destinationViewController.managedObjectContext = persistentContainer.viewContext 
      } 
     } 
    } 

    func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
     workoutDesignerTable.beginUpdates() 
    } 

    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
     workoutDesignerTable.endUpdates() 

     updateView() 
    } 

    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; 
     default: 
      print("...") 
     } 
    } 

} 
+1

データを永続化するには、管理オブジェクトコンテキストを保存する必要があります。 – vadian

+0

セーブボタン機能saveexerciseで達成されたことはありますか? – infernouk

+0

いいえ、インスタンスを作成していますが、コンテキストを保存していません。どこか別の場所で 'context.save()'と呼ぶ必要があります – vadian

答えて

0

あなたはcontext.save()を呼び出す必要があります。

関連する問題