2016-07-14 7 views
1

Ich benutze Realm für meine Notizblock-App, um das Array noteTitles zu speichern, das von einer benutzerdefinierten Klasse ist. Die App funktioniert gut, aber wenn sie speichern soll, passiert sie nicht. Wenn ich die App neu starte, sind die Notizen weg. Ich werde allen Dateien Code geben. Außerdem möchte ich, dass der Benutzer Notizen hinzufügt, und ich brauche den ObjectForPrimaryKey, um ihn jedes Mal zu aktualisieren, damit für jede Notiz eine neue ID erstellt wird.Swift 2.2, RealmSwift - Wiederherstellung von Daten funktioniert nicht

Hinweis Klassencode:

import Foundation 
import RealmSwift 

class Note: Object { 
    dynamic var title = "" 
    var content = "" 
    var id = 0 

    override class func primaryKey() -> String? { 
     print("id generated") 
     return "id" 
    } 
} 

Viewcontroller (Wo ich die Noten schreiben) Code:

import UIKit 
import RealmSwift 

var note2 = Note() 
var note: Note! 

let realm = try! Realm() 

class ViewController3: UIViewController, UITextViewDelegate { 
    var note: Note! 

    @IBOutlet var noteText: UITextView! 
    @IBOutlet var noteTitle: UITextField! 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     noteTitle.text = note.title 
     noteText.text = note.content 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 

     note.title = noteTitle.text! 
     note.content = noteText.text 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func textViewDidEndEditing(textView: UITextView) { 

     func noteEnded(note2: Note) { 

     note2.title = note.title 
     note2.content = note.content 

     note2.id = note.id 

     do { 
      try realm.write { 
       realm.add(noteTitles, update: true) 
       print("added") 
      } 
      } catch { 
      print("There was a problem") 
     } 
    } 

    print("editing ended") 

} 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     print(note2.id) 
     self.noteText.delegate = self 
     // Do any additional setup after loading the view. 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     self.view.endEditing(true) 
     noteTitle.resignFirstResponder() 
     noteText.resignFirstResponder() 
    } 
} 

Tableviewcontroller (Hinweis List) Code:

import UIKit 
import RealmSwift 

var noteTitles:[Note] = [] 

class TableViewController: UITableViewController { 

    // MARK: - Table view data source 
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return noteTitles.count 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell 

     cell.textLabel!.text = noteTitles[indexPath.row].title // error here 
     // Configure the cell... 
     return cell 
    } 

    override func viewDidAppear(animated: Bool) { 
     tableView.reloadData() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     sleep(2) 

     if realm.objectForPrimaryKey(Note.self, key: 0) != nil { 
      realm.objectForPrimaryKey(Note.self, key: 0) 
     } 




     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 

     if editingStyle == UITableViewCellEditingStyle.Delete { 
      noteTitles.removeAtIndex(indexPath.row) 
      tableView.reloadData() 
     } 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier! == "editNote" { 
      let noteDetailViewController = segue.destinationViewController as! ViewController3 
      let selectedIndexPath = tableView.indexPathForSelectedRow 
      noteDetailViewController.note = noteTitles[selectedIndexPath!.row] 
     } else if segue.identifier! == "addNote" { 
      let note = Note() 
      noteTitles.append(note) 
      let noteDetailViewController = segue.destinationViewController as! ViewController3 
      noteDetailViewController.note = note 
     } 
    } 
} 

Vielen Dank im Voraus!

+0

Haben Sie versucht, den Inhalt der Datei default.realm mit Realm-Browser zu betrachten? –

+0

Ich sehe nicht, wo Sie Ihr Objekt im notesTitles-Array speichern. Versuchen Sie so etwas in Ihrer ** viewDidLoad ** -Methode: 'noteTitles.add (realm.objectForPrimaryKey (Note.self, key: 0))' – Masterfego

+0

Es gibt mir einen Fehler, wenn ich es ausführe und auf eine Notiz klicke . Der Fehler lautet: Versuch, ein Objekt außerhalb einer Schreibtransaktion zu ändern. Was sollte ich ändern, um es zu beheben? Ich habe den Code der ViewDidLoad-Funktion von tableViewControler hinzugefügt –

Antwort

2

Die Funktion noteEnded sollte nicht innerhalb der textViewDidEndEditing und es wird nicht aufgerufen. dieses Versuchen

func noteEnded(note2: Note) { 
    do { 
     try realm.write { 
      realm.add(note2, update: true) 
      print("added") 
     } 
    } catch { 
     print("There was a problem") 
    } 
} 

func textViewDidEndEditing(textView: UITextView) { 
    note2.title = note.title 
    note2.content = note.content 
    note2.id = note.id 

    noteEnded(note2) 
    print("editing ended") 

} 

Es ist auch besser ist „Fertig“ zu haben, um die Notiz zu speichern. Einfach zu handhaben und speichern.