2017-01-26 4 views
0

Ich habe eine Tabellenansicht, die ein Array auffüllt. Ich kann zu Firebase hinzufügen und die Tabellenansicht neu laden, um das neu hinzugefügte Objekt anzuzeigen. Wenn ich 5 Gegenstände in Firebase habe, dann hätte ich 5 auf dem Tisch. Ich bin in der Lage, Elemente von Firebase durch Code zu entfernen und die Tabellenansicht neu zu laden, und es funktioniert gut.Swift Firebase TableView kann das letzte Element nicht entfernen

Mein Problem ist, wenn ich auf dem letzten Element auf firebase und tableview bin und ich lösche das letzte Element, die Firebase entfernt es ganz gut, aber die Tabellenansicht behält das letzte Element, aber es grau aus.

Die App nicht abstürzen es dort nicht nur bleibt, bis ich etwas hinzufügen, wieder in.

Natürlich, wenn ich auf dieser abgeblendet Zelle stürzt meine App tippen, weil ich einen Index außerhalb des zulässigen Bereichs am tippen.

Gibt es Code, den ich hinzufügen muss, um diese ausgegraute Zelle zu verhindern und nur eine leere Tabellenansicht zu haben?

evidence

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return serviceArray.count 
    } 


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "serviceCell", for: indexPath as IndexPath) as! ServiceTableViewCell 

    let row = indexPath.row 


    // cell.serviceLogoImage.image = UIImage.init(named: serviceArray[row].serviceUrl!) 

    cell.serviceNameLabel.text = serviceArray[row].serviceName 

    if serviceArray[row].serviceStatus == true { 

     cell.serviceStatusView.backgroundColor = .green 

    } else { 

     cell.serviceStatusView.backgroundColor = .red 

    } 

    return cell 
    } 

Ich muss eine kleine Bedingung fehlt, weil anders als dies der Tableview perfekt mit Feuerbasis arbeitet ...

bearbeiten 1

ich den Code hinzugefügt haben, verwendet um die Tabellenansicht zu füllen

var serviceArray: [ServiceClass] = [] 


func pullCardData() { 

serviceArray.removeAll() 

let cardRef = ref.child("cards") 

cardRef.observeSingleEvent(of: .value, with: { snapshot in 

    for cards in snapshot.children { 

    let allCardIDs = (cards as AnyObject).key as String 

    if allCardIDs == self.cardID { 

     let thisCardLocation = cardRef.child(self.cardID) 

     thisCardLocation.observeSingleEvent(of: .value, with: { snapshot in 

     let thisCardDetails = snapshot as FIRDataSnapshot 

     let cardDict = thisCardDetails.value as! [String: AnyObject] 

     self.selectedCard.cardID = thisCardDetails.key 
     self.selectedCard.nickname = cardDict["nickname"] as! String 
     self.selectedCard.type = cardDict["type"] as! String 

     self.cardNickNameLabel.text = cardDict["nickname"] as? String ?? "" 

     let thisCardServices = self.ref.child("cards").child(self.cardID).child("services") 
     let serviceRefLoc = self.ref.child("services") 

     thisCardServices.observeSingleEvent(of: .value, with: {serviceSnap in 

      if serviceSnap.hasChildren() { 

      for serviceChild in serviceSnap.children { 

       let serviceID = (serviceChild as AnyObject).key as String 

       serviceRefLoc.observeSingleEvent(of: .value, with: {allServiceSnap in 

       if allServiceSnap.hasChildren() { 


        for all in allServiceSnap.children { 


        let allServs = (all as AnyObject).key as String 

        let thisServiceLocationInServiceNode = self.ref.child("services").child(serviceID) 

        if serviceID == allServs { 

         thisServiceLocationInServiceNode.observeSingleEvent(of: .value, with: {thisSnap in 

         let serv = thisSnap as FIRDataSnapshot 

         let serviceDict = serv.value as! [String: AnyObject] 

         let aService = ServiceClass() 


         self.serviceCurrent = serviceDict["serviceStatus"] as? Bool 
         self.serviceName = serviceDict["serviceName"] as? String 
         self.serviceURL = serviceDict["serviceURL"] as? String 
         self.serviceFixedBool = serviceDict["serviceFixed"] as? Bool 
         self.serviceFixedAmount = serviceDict["serviceAmount"] as? String 


         aService.serviceUrl = serviceDict["serviceURL"] as! String 

         aService.serviceName = serviceDict["serviceName"] as! String 

         aService.serviceStatus = serviceDict["serviceStatus"] as? Bool 


         aService.serviceID = serviceID 


         self.serviceArray.append(aService) 

         self.tableView.reloadData() 


         }) 
        } 
        } 
       } 
       }) 
      } 
      } 
     }) 
     }) 
    } 
    } 
}) 

}

Edit 2

hatte ich die Idee zu prüfen, ob die Feuerbasis Knoten auch Exits (sollte es nicht, da ich es einfach gelöscht. SO

func checkIfDataExits() { 

ref.observeSingleEvent(of: .value, with: { snapshot in 

    if snapshot.hasChild("services") { 

    self.pullCardData() 

    } else { 
    self.tableView.endUpdates() 
    print("no childen") 
    } 

}) 
} 

Wie erwartet, da ich mehr da nicht die Feuerbasis Knoten haben druckt es „keine Kinder“, aber es zeigt immer noch die letzte Zelle Tableview .... so

+0

Können Sie uns den Code zeigen, dass Ihr serviceArray füllt bitte? – Grifas

+0

@Grifas, ja, eine Sekunde erlauben Sie mir, die Frage zu bearbeiten – RubberDucky4444

+0

Welche Firebase-Methode verwenden Sie, um Daten von Firebase zu holen? – Grifas

Antwort

0

Nun, mein zuletzt war eine Codezeile davon entfernt zu sein, was ich brauchte.

Statt

self.tableView.endUpdates() 

Ich ersetzte es mit

self.tableView.reloadData() 

So (ohne dass lange Verfahren retying) habe ich einfach eine andere Methode schrieb

func checkIfDataExits() { 

    serviceArray.removeAll() 

    ref.observeSingleEvent(of: .value, with: { snapshot in 

     if snapshot.hasChild("services") { 

     self.pullCardData() 

     } else { 

     self.tableView.reloadData() 
     } 

    }) 
    } 

und diese Methode entscheidet, ob oder nicht einmal so lange laufen

0

Entschlossenheit:

serviceArray.removeAll() 

Code:

ref.observeSingleEvent(of: .value, with: { snapshot in 

     if snapshot.hasChild("services") { 

     self.pullCardData() 

     } else { 
     //code here 
     serviceArray.removeAll() 
     self.tableView.reloadData() 
     } 

    }) 
Verwandte Themen