2016-07-14 2 views
1

Я использую realm для своего приложения в блокноте для хранения массива noteTitles, который относится к пользовательскому классу Note. Приложение работает нормально, но когда оно должно быть сохранено, оно не проходит. Когда я перезапущу приложение, заметки исчезнут. Я передам код всем файлам. Кроме того, я хочу, чтобы пользователь добавлял заметки, и мне нужно, чтобы ObjectForPrimaryKey обновлялся каждый раз, поэтому для каждой заметки создается новый идентификатор.Swift 2.2, RealmSwift - Извлечение данных не работает

Примечание Код класса:

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 (где я пишу заметки) Код:

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 (Примечание Список) Код:

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 
     } 
    } 
} 

Заранее спасибо!

+0

Вы пробовали посмотреть содержимое файла default.realm с помощью браузера realm? –

+0

Я не вижу, где вы храните свой объект в массиве notesTitles. Попробуйте что-то подобное в вашем методе ** viewDidLoad **: 'noteTitles.add (realm.objectForPrimaryKey (Note.self, key: 0))' – Masterfego

+0

Это дает мне ошибку, когда я запускаю ее и нажимаю и оставляю заметку , Ошибка: Попытка изменить объект за пределами транзакции записи. Что я должен изменить, чтобы исправить это. Я добавил код в функцию tableViewControler ViewDidLoad. –

ответ

2

Функция noteEnded не должна находиться внутри textViewDidEndEditing, и она не вызывается. Попробуйте

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") 

} 

Это также лучше иметь «Готово», чтобы сохранить заметку. Легко обрабатывать ввод и сохранять.

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