2016-09-04 5 views
0

Ich bin ziemlich neu im Bereich der Codierung und ich versuche, TableView mit Firebase zu implementieren. Was ich versuche zu erreichen ist zu:Firebase + Swift: Löschen von Zeilen in Tabelle nicht möglich

  1. eine Seite ‚Einstellungen‘ Create Tableview mit denen Benutzer eingegeben ihre Lieblingslocation
  2. Erstellen Sie ein Formular (ich benutze Eureka hier) für Benutzer bestimmte Optionen aus dem holen Favoriten sie Eingang in den Einstellungen
  3. zulassen Löschung dieser Reihenfolge ‚Favoriten‘

in für die Formen zu arbeiten, habe ich die Firebase Daten bei AppDelegate durch user.uid gefiltert ziehen. um diese 'Favoriteneinstellungen' zu füllen. Wenn ich versuche, Zeilen mit commitEdittingStyle in den 'Einstellungen' zu löschen, wird der Fehler mit der ungültigen Anzahl von Zeilen ausgegeben. Ich habe versucht, verschiedene Lösung zu googeln und versuchte auch dispatch_async, aber es löst irgendwie nicht ganz mein Problem. Einige Schnipsel meines Codes wie folgt:

public var setUpFavLocations: [(String)] = [] 
public var favLocDatabase: [FIRDataSnapshot]! = [] 


@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 
var ref: FIRDatabaseReference! 
var _refHandle: FIRDatabaseHandle! 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    FIRApp.configure() 

    let favLocVC: UITableViewController = FavLocationsTableViewController(style: UITableViewStyle.Plain) 


    ref = FIRDatabase.database().reference() 

    if let user = FIRAuth.auth()?.currentUser { 

     self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildAdded, withBlock: { (snapshot) in 
      favLocDatabase.append(snapshot) 
      let insertionIndexPath = NSIndexPath(forRow: favLocDatabase.count - 1, inSection: 0) 
      favLocVC.tableView.insertRowsAtIndexPaths([insertionIndexPath], withRowAnimation: .Automatic) 
     }) 

     self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildAdded, withBlock: { (snapshot) in 
      setUpFavLocations.append(snapshot.value?["favLocation"] as! String) 
     }) 

//At FavLocationsTableViewController, aka at the settings page 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print("count \(setUpFavLocations.count)") 
    return setUpFavLocations.count 
} 

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

    if editingStyle == .Delete { 

     if let user = FIRAuth.auth()?.currentUser { 
      let row = favLocDatabase[indexPath.row] 

      self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildRemoved, withBlock: { (snapshot) -> Void in 
        favLocDatabase.removeAtIndex(indexPath.row) 
        self.tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: indexPath.row, inSection: 0)], withRowAnimation: .Automatic) 

      }) 
      row.ref.removeValue() 
     } 

    } 
} 

Dadurch wirft mir die folgende Fehler

beenden app aufgrund nicht abgefangene Ausnahme
‚NSInternalInconsistencyException‘ Grund: ‚Ungültige Update: ungültige Anzahl der Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach der Aktualisierung (5) muss gleich der Anzahl der Zeilen in diesem Abschnitt vor dem Update (5) sein, plus oder minus die Anzahl der Zeilen eingefügt oder d aus diesem Abschnitt (0 eingefügt, 1 gelöscht) und plus oder minus die Anzahl der Zeilen in oder aus dieser Abschnitt (0 eingezogen, 0 ausgezogen). '

Pls Hilfe, ich bin ziemlich fest hier seit Tagen. Sehr geschätzt.

+0

Warte, hast du nicht gesagt, dass du Eureka benutzt? Warum nicht Eureka auch hier benutzen? Es ist _much_ einfacher! – Sweeper

+0

@Sweeper Ich kann keine Eureka-Zelle finden, die am besten zu diesem Zweck passt. – Koh

+0

Könnte es sein, dass Sie das Objekt zweimal aus der Datenbank entfernen ('removeAtIndex' und' removeValue')? Und warum erstellen Sie einen neuen Indexpfad, anstatt nur den (tatsächlich gleichen) Pfad zu verwenden, der im Parameter übergeben wurde? – vadian

Antwort

0

Sie erstellen jedes Mal einen neuen Listener, wenn Sie eine Zeile löschen, die nicht gut sein kann.

Try bewegt:

self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildRemoved, withBlock: { (snapshot) -> Void in 
    favLocDatabase.removeAtIndex(indexPath.row) 
    self.tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: indexPath.row, inSection: 0)], withRowAnimation: .Automatic) 
}) 

in Ihr AppDelegate mit den anderen Zuhörern.

Auch ich bemerkte, dass Sie Ihre Beobachter nicht behandeln, also, wenn Sie Ihre App öffnen und schließen, werden die Beobachter duplizieren. Sie sollten die Beobachter entfernen, wenn die App in den Hintergrund tritt und sie erneut instanziieren, wenn die App in den Vordergrund tritt. Sie finden Methoden für diese Ereignisse in Ihrem AppDelegate.

+0

Wie bekomme ich den IndexPath bei AppDelegate? – Koh

Verwandte Themen