2017-03-07 6 views
0

Ich versuche, eine Schaltfläche zu entwerfen, mit der Benutzer eine Auflistung in einer Sammlungsansichtstabelle "speichern" können. Wenn die Schaltfläche berührt wird, werden die Daten der Liste in Realm gespeichert, und ein anderer View-Controller präsentiert diese Daten.RealmSwift "Objekt wurde gelöscht oder ungültig gemacht"

Während ich in der Lage bin, die Daten auf Realm zu erhalten und zu zeigen und zu entfernen, wenn ich die Schaltfläche erneut antippen, wenn ich es das dritte Mal antippen, bekomme ich "Objekt wurde gelöscht oder ungültig gemacht", auch wenn es ein andere Auflistung. Hier ist der Code einen kleinen Einblick in das, was ich versuche zu tun:

let lib = BookCollection() 

let realm = try! Realm() 

var unSavedBook = RealmBook() 

func save(_ cell: HomeBookPreviewViewCell) { 

    // This allows me to get the indexpath of a cell to use buttons on the collection view. 

    guard let indexPath = self.bookListing.indexPath(for: cell) else { 
     print("whaaaaaaa") 
     return 
    } 


    if lib.Library[indexPath.item].saved { 

     let savedBooks = realm.object(ofType: RealmBook.self, forPrimaryKey: lib.Library[indexPath.item].isbn!) 
     try! realm.write { 



      realm.delete(savedBooks!) 

      //updates other view controller 

      NotificationCenter.default.post(name: .reload, object: nil) 
     } 

     cell.saveButton.setImage(#imageLiteral(resourceName: "Star"), for: .normal) 
     lib.Library[indexPath.item].saveBook(save: false) 
    } 
    else if (!lib.Library[indexPath.item].saved) { 

     try! realm.write { 
     //unSavedBooks is declared outside of function. 

     //lib.Libary is an object that holds an array of Book objects with book attributes. 

     unSavedBook.addRealmBook(lib.Library[indexPath.item].title!, lib.Library[indexPath.item].author!, lib.Library[indexPath.item].edition!, lib.Library[indexPath.item].publisher!, "\(lib.Library[indexPath.item].type!)", "\(lib.Library[indexPath.item].condition!)", "\(lib.Library[indexPath.item].subject!)", lib.Library[indexPath.item].seller!, RealmOptional<Float>(lib.Library[indexPath.item].price), lib.Library[indexPath.item].isbn!) 

      realm.add(unSavedBook) 

      //updates other view controller 
      NotificationCenter.default.post(name: .reload, object: nil) 

     } 




     cell.saveButton.setImage(#imageLiteral(resourceName: "Star-Saved"), for: .normal) 

     lib.Library[indexPath.item].saveBook(save: true) 
    } 
    print("Button tapped on row \(indexPath.item)") 
} 

Ich verstehe, dass ich die Datenlast in mit dem gespeicherten boolean beharrte machen müssen, aber ich verstehe nicht, warum sie gewonnen‘ t erlauben Sie mir, zum dritten Mal zu klicken.

+0

Können Sie mehr Code posten? denn ich bin ein bisschen verwirrt mit mehreren var wie 'lib.Library [indexPath.item] .saved'. etc btw, können Sie ein paar Screenshots posten, wäre schön, eine klare Idee zu haben –

+1

@PangHoMing Edited es, um es ein wenig klarer zu machen, sorry für den chaotischen Code (ich beabsichtige, es später zu löschen, da gibt es eine andere Komponente, die ich hinzufügen muss .) –

Antwort

0

Sie sehen diese Ausnahme, wenn Sie versuchen, die Eigenschaften des Bereichsobjekts zu lesen, das wahrscheinlich gelöscht wurde. Stellen Sie sicher, dass Sie keine starken Verweise auf gelöschte Realm-Objekte haben, oder versuchen Sie, die isInvalidated-Eigenschaft zu verwenden, um diesen Fall zu behandeln.

0

Ich verwendete CoreData + Magical Record, wenn ich iOS entwickle. Und Realm nur, wenn ich Android-App entwickle.

Paar Fragen,

  1. wie Coredata/andere moderne Datenbank, das Resultat für Ihre geholt von Reich-Abfragen werden automatisch aktualisiert. (Ref: https://realm.io/docs/swift/latest/#auto-updating-results). Also, ich bin ein wenig verwirrt mit Ihrem NotificationCenter.default.post(name: .reload, object: nil) Anruf. Können Sie uns auch Ihre Implementierungen der Datenquellen-Delegiertenmethoden von Collection View zeigen? da dort einige Realm-Aufrufe enthalten sind.
  2. Die zweite Frage bezieht sich auf Ihren App-Flow. Aus meinem Verständnis gibt es eine Collection View, jede Zelle zeigt eine Book. Wenn Sie auf die Zelle Book klicken, wird eine andere Ansicht angezeigt, in der die Buchinformationen angezeigt werden. Und wenn Sie das zweite Mal klicken, löschen Sie das Buch. Aber wenn das Buch gelöscht wird, warum kann man dann zum dritten Mal auf diese Zelle klicken? Erwarten Sie, dass die Zelle Book gelöscht wird oder nicht? Post ein paar Screenshot wäre schön für uns, um Ihnen zu helfen :)
Verwandte Themen