J'écris un jeu iOS dans Swift et je voulais inclure un label de meilleurs scores à la fin. Je pense que la fonction de sauvegarde est correcte, mais la charge est celle qui me pose des problèmes. J'ai déjà créé une entité ("BestScores") et les attributs ("classicBestScoreTF"):
Pour sauvegarder le meilleur score:
var bestscore25 = 1000
var score: int
func savescore() {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext!
var score25: AnyObject! = NSEntityDescription.insertNewObjectForEntityForName("BestScores", inManagedObjectContext: context) as NSManagedObject
score25.setValue(score, forKey: "classicBestScoreTF")
context.save(nil)
}
func loadscore() {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext!
bestScore25 = valueForKey("classicBestScoreTF") as Int
}
func endgame() {
if score > bestScore25 {
savescore()
loadscore()
bestScoreLabel.text = "Best Score: \(bestScore25)"
}
if score < bestscore {
loadscore()
bestScoreLabel.text = "Best Score: \(bestScore25)"
}
}
Cela ne fonctionne pas :( aidez s'il vous plaît!
La sauvegarde des données:
var person = NSEntityDescription.insertNewObjectForEntityForName("Person",
inManagedObjectContext: self.managedObjectContext!) as Person
person.name = "Mary"
person.age = Float(arc4random() % 100)
var error : NSError? = nil
if !self.managedObjectContext!.save(&error) {
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
Chargement des données:
var error: NSError? = nil
var fReq: NSFetchRequest = NSFetchRequest(entityName: "Frases")
fReq.predicate = NSPredicate(format: "id contains[c] %@", String(day))
var sorter: NSSortDescriptor = NSSortDescriptor(key: "id" , ascending: false)
fReq.sortDescriptors = [sorter]
fReq.returnsObjectsAsFaults = false
let result : [AnyObject] = self.managedObjectContext!.executeFetchRequest(fReq, error:&error)!
Mis à jour pour Swift:
utilisé sous un code simple pour charger, insérer, supprimer une date;
import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate{
// MARK:- Variable Declarations
@IBOutlet weak var mTableView: UITableView!
var manageObjectContext: NSManagedObjectContext!
var eventArray = [Event]()
// MARK:- ViewController LifeCycle Methods
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Event Reminder"
manageObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
self.loadSaveData()
}
override func viewWillAppear(_ animated: Bool) {
// Remove empty cell from tableview
mTableView.tableFooterView = UIView(frame: .zero)
}
// MARK:- TableView DataSource and Delegate Methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return eventArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ViewControllerTableViewCell")! as! ViewControllerTableViewCell
cell.layer.cornerRadius = 05
let eventArrayItem = eventArray[indexPath.row]
if let eventImage = UIImage(data: (eventArrayItem.event_image! as Data)){
cell.mImageView.image = eventImage
}
cell.mEventHeadingLabel.text = eventArrayItem.event_heading
cell.mShortDescriptionLabel.text = eventArrayItem.event_description
return cell
}
// To delete Particular cell/row from tableview
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let eventArrayItem = eventArray[indexPath.row]
if editingStyle == .delete {
manageObjectContext.delete(eventArrayItem)
do {
try manageObjectContext.save()
} catch let error as NSError {
print("Error While Deleting Note: \(error.userInfo)")
}
}
self.loadSaveData()
}
// MARK:- IBAction Methods
@IBAction func actionOnPlusButton(_ sender: Any) {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.delegate = self
self.present(imagePicker, animated: true, completion: nil)
}
// MARK:- ImagePicker Delegate Methods
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let mImage = info[UIImagePickerControllerOriginalImage] as? UIImage{
picker.dismiss(animated: true, completion: {
self.createEventItemWith(selectedImage: mImage)
})
}
}
// MARK:- Instance Methods
func createEventItemWith(selectedImage: UIImage) {
let eventItem = Event(context: manageObjectContext)
let alertController = UIAlertController(title: "Add Event", message: "Enter event and it's description", preferredStyle: .alert)
let saveAction = UIAlertAction(title: "Save", style: .default, handler: {
alert -> Void in
let eventNameTextField = alertController.textFields![0] as UITextField
let descriptionTextField = alertController.textFields![1] as UITextField
print("firstName \(String(describing: eventNameTextField.text)), secondName \(String(describing: descriptionTextField.text))")
if eventNameTextField.text != "" || descriptionTextField.text != ""{
eventItem.event_heading = eventNameTextField.text
eventItem.event_description = descriptionTextField.text
eventItem.event_image = NSData(data: UIImageJPEGRepresentation(selectedImage, 0.3)!)
do{
try self.manageObjectContext.save()
self.loadSaveData()
}catch{
print("Could not save data: \(error.localizedDescription)")
}
}else{
self.showAlertMessageToUser(title: "Alert", messageToUser: "Fields should not be empty, Please enter given info...")
}
})
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: {
(action : UIAlertAction!) -> Void in
self.manageObjectContext.reset()
})
alertController.addTextField { (textField : UITextField!) -> Void in
textField.placeholder = "Enter event Name"
}
alertController.addTextField { (textField : UITextField!) -> Void in
textField.placeholder = "Enter event description in short"
}
alertController.addAction(saveAction)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)
}
func showAlertMessageToUser(title: String, messageToUser: String) {
let alert = UIAlertController(title: title, message: messageToUser, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
func loadSaveData() {
let eventRequest: NSFetchRequest<Event> = Event.fetchRequest()
do{
eventArray = try manageObjectContext.fetch(eventRequest)
self.mTableView.reloadData()
}catch
{
print("Could not load save data: \(error.localizedDescription)")
}
}
}
Pour sauvegarder des données, vous devriez utiliser:
context.insertNewObjectForEntityForName(...)
Et pareil quand vous chargez des données, ça devrait être:
context.valueForKey (...)
Cependant, je ne suis pas sûr que ce soit même la syntaxe correcte, car vous devrez peut-être obtenir un tableau d'entités, puis l'objet à l'indice 0. À ce propos, pourquoi utilisez-vous les données de base pour les scores élevés? Vous voudrez peut-être examiner les valeurs par défaut des utilisateurs ou icloud, les données de base sont davantage conçues pour les bases de données