This function is supposed to add the current date into a list that is stored in memory whenever an addButton is pressed, however whenever the app is closed and reloaded the new date does not appear. The data also seems to disappear after switching views.
var selectedPersonFirst = ""
var selectedPersonLast = ""
let today = NSDate()
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
@IBAction func addButtonPressed(sender: AnyObject) {
let entityDescription = NSEntityDescription.entityForName("People", inManagedObjectContext: managedObjectContext!)
let request = NSFetchRequest()
request.entity = entityDescription
let firstPred = NSPredicate(format: "(firstName = %@)", selectedPersonFirst)
let secondPred = NSPredicate(format: "(lastName = %@)", selectedPersonLast)
let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [firstPred, secondPred])
request.predicate = predicate
var error: NSError?
var objects = managedObjectContext?.executeFetchRequest(request, error: &error)
if let results = objects{
let days = results[0].valueForKey("days") as! NSMutableArray
days.addObject(NSDate())
let person = results[0] as! People
person.setValue(days, forKey: "days")
}
managedObjectContext!.save(nil)
self.tableView.reloadData()
}
Here is the people subclass of NSManagedObject:
import Foundation
import CoreData
class People: NSManagedObject {
@NSManaged var days: AnyObject
@NSManaged var dayZero: NSDate
@NSManaged var firstName: String
@NSManaged var gender: String
@NSManaged var lastName: String
}
ViewController in which the days
NSMutableArray is created:
import UIKit
import CoreData
class NewPersonViewController: UIViewController {
@IBOutlet weak var firstName: UITextField!
@IBOutlet weak var lastName: UITextField!
@IBOutlet weak var gender: UISegmentedControl!
@IBOutlet weak var dayZeroDate: UIDatePicker!
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var personName : String = ""
var currentDayNumber : Int? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if segue.identifier == "DoneNewPersonSegue" {
let entityDescription = NSEntityDescription.entityForName("People", inManagedObjectContext: managedObjectContext!)
let person = People(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)
person.firstName = self.firstName.text
person.lastName = self.lastName.text
person.days = NSMutableArray()
person.gender = gender.description
person.dayZero = dayZeroDate.date
save()
}
}
func save() {
var error : NSError?
if(managedObjectContext!.save(&error) ) {
println(error?.localizedDescription)
}
}
}
Data Model:
The problem was that I was using a mutable type, so a change wasn't calling the setter method. I changed the code to create a copy of the object so the change would be recognized:
let days1 = results[0].valueForKey("days") as! NSMutableArray
let days = days1.mutableCopy() as! NSMutableArray
days.addObject(NSDate())
let person = results[0] as! People
person.setValue(days, forKey: "days”)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.