2016-07-14 8 views
1

私はメモ帳アプリケーション用にrealmを使用しており、カスタムクラスの配列であるnoteTitlesを保存しています。アプリはうまく動作しますが、保存する必要があるときは通過しません。アプリを再起動するとメモが消えてしまいます。私はすべてのファイルにコードを与えます。また、ユーザーにノートを追加してもらいたいので、毎回更新するためにObjectForPrimaryKeyが必要になりますので、各ノートごとに新しいIDが作成されます。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

realmブラウザを使用してdefault.realmファイルの内容を調べてみましたか? –

+0

私はあなたのオブジェクトをnotesTitles配列のどこに格納するのか分かりません。あなたの** viewDidLoad **メソッドでこのようなものを試してください: 'noteTitles.add(realm.objectForPrimaryKey(Note.self、key:0))' – Masterfego

+0

これを実行してノート内外をクリックするとエラーが表示されます。エラーは次のとおりです。書き込みトランザクション外のオブジェクトを変更しようとしています。それを修正するにはどうすればよいですか。 tableViewControler ViewDidLoad関数にコードを追加しました –

答えて

2

noteEndedtextViewDidEndEditingの中に入れてはいけません。 ノートを保存するためにボタンを「完了」しているとも優れている。この

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

} 

を試してみてください。簡単に入力を処理し、保存します。

関連する問題