2016-12-29 2 views
1

ここで間違っていることを理解しようとしています。レルム内のオブジェクトを削除してテーブルビューを同期させておく

tableViewとdetailViewの2つの基本的なviewControllerがあります。

データが変更された場合、tableViewをリロードするための通知を購読しています。 detailViewControllerからレコードを変更でき、変更が反映されます。 tableViewからレコードを削除しても機能します。

しかし、detailViewに削除ボタンを追加することもできますが、viewControllerとRealmが同期しなくなりクラッシュします。 'RLMException'、理由: 'オブジェクトが削除または無効化されました。'次回にアプリを読み込むと、レコードが削除され、機能します。

別のviewControllerでオブジェクトを削除し、tablieViewコントローラを更新したままにするにはどうすればよいですか?

class TableViewController: UITableViewController { 
    var token:NotificationToken? 
    var expenses: Results<Expense> { 
    get { 
     let realm = try! Realm() 
     return realm.objects(Expense.self) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let realm = try! Realm() 
     token = realm.addNotificationBlock { [weak self] notification, realm in 
     DispatchQueue.main.async { 
      self?.tableView.reloadData() 
     } 
    } 
} 

class DetailViewController { 
    func deleteButtonTapped() { 
     let realm = try! Realm() 
     if let expense = self.expense { 
      try! realm.write { 
      realm.delete(expense) 
     } 
     // crashes during load 
     performSegue(withIdentifier: "unwindToExpensesTable", sender: self) 
    } 
} 
+1

あなたは 'DetailViewController'に' expenses'への参照を保持していますか?オブジェクトを削除した後は、オブジェクトへの参照をすべて削除してください。 – jervine10

+0

jervine10、あなたは男です!クラッシュするtableViewControllerではなく、参照を保持しているのでdetailViewです。あなたが答えとしてコメントを書くなら、私はあなたにこのクレジットを与えることができます。 :-) – jannej

答えて

1

削除さExpenseオブジェクトへの参照を保持していないことを確認してください。オブジェクトを削除した後にDetailViewControllerにある参照をクリアした後、再びアクセスできる配列に配列が含まれていないことを確認してください。

関連する問題