2016-11-25 4 views
0

Я сохраняю упражнение в основных данных и вызываю его в таблицу, это работает с точки зрения переноса информации с пользовательского ввода в таблицу, однако coredata не сохраняется, поэтому, когда я открываю приложение, запись теряется ,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) 
    } 

} 

И это TableView:

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

ответ

Смежные вопросы