2017-08-11 3 views
0

Ich habe ein Problem mit UITableView Einfügen, Löschen von Zeilen.Swift UITableView, Einfügen, dann löschen, dann einfügen

Ich versuche, einen "Facebook Messenger" gesehen Effekt in einer UITableView. Ich habe viele Zellen, die jeweils eine Nachricht anzeigen, und zwischen ihnen gibt es viele Zellen, die jeweils auf Personen hinweisen, die diese Nachricht bisher gesehen haben. Alle diese Daten sind korrekt gespeichert.

Jetzt möchte ich, dass, wenn ich eine gesehene Benachrichtigung zu einer gesuchten Zelle aus der Tabelle zu löschen und dann eine andere in den richtigen Index abhängig von meiner Datenquelle (in den meisten Fällen letzter Artikel). Und wenn ein Benutzer eine Nachricht sendet, füge ich seine Nachricht zur Tabelle hinzu, entferne dann seine zuletzt gesehene Zelle und setze dann eine weitere nach seiner Nachricht ein.

nun die Logik Debuggen alles in Ordnung ist mit Datenquelle zu aktualisieren und einfügen anfordert, löschen auf den UITableView, aber ich bekomme immer noch:

App beenden aufgrund nicht abgefangene Ausnahme ‚NSInternalInconsistencyException‘, Grund: Ungültige Aktualisierung: ungültig Anzahl der Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach der Aktualisierung (36) muss gleich der Anzahl der Zeilen in diesem Abschnitt vor der Aktualisierung (36) plus sein oder minus die Anzahl der Zeilen, die aus diesem Abschnitt eingefügt oder gelöscht wurden (1 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der Zeilen, die in den Bereich verschoben oder von ihm entfernt wurden (0 eingezogen, 0 ausgezogen). '

Ich habe‘versucht, in einem beginUpdates(); und endUpdates(); den Anruf dieser Logik zu setzen. Alle Einfügung, Löschen wird innerhalb main thread (UI)

gerufen Jede mögliche Hilfe würde geschätzt, vielen Dank.

bearbeiten

hier ist mein Code:

//// Insert a seen status for user, handles seen logic 
private func insertSeen(event: UEvent?) -> (removed: Int, inserted: Int) { 
    // Make a holder for insertion result 
    var result: (removed: Int, inserted: Int) = (removed: -1, inserted: -1); 

    // Check if no event was given 
    if(event == nil){ 
     return result; } 

    if(event?.creatorID == "" && self.type == .single && self.participants.count > 0){ 
     event?.creatorID = self.participants[0].ID 
     event?.creatorName = self.participants[0].username; 
    } 

    // Get last seen for targeted user 
    let lastSeen = lastSeenForUser(id: (event?.creatorID)!); 
    // Get targeted participant 
    var particiapnt = self.participant(id: event!.creatorID); 

    // If sender is self -> he will not be found in particiapnts list 
    // So, we should get it's data from UserData 
    if(event?.creatorID == UserData.current.ID){ 
     particiapnt = UserData.current; 
    } 
    // Check if no event was given 
    if(particiapnt == nil){ 
     return result; } 

    let name = particiapnt?.username; 
    var image = particiapnt?.photo; 
    if(image != nil) { image = image?.Scale(Width: 20); } 

    // Store number of events before updates -> usefull to tell if seen has created a new event 
    let count: Int = self.events.count; 

    // Check if user has just sent a seen status 
    if((count > 0 && lastSeen == count - 1) || particiapnt == nil){ 
     // Return a no insertion result [-1,-1] 
     return result; 
    } 

    if(delegate != nil){ 
     delegate.beginUpdates(); 
    } 

    // Check if user hasn't sent any seen event before 
    if(lastSeen < 0){ 
     // Check if last event in group is seen 
     if(self.events.count > 0 && self.events.last?.type == .seen) { 
      // Add participant to last event 
      let _ = self.events.last?.addParticipant(id: (event?.creatorID)!, name: name!, image: image); 

      // Return where this user seen event was added 
      result = (removed: lastSeen, inserted: self.events.count - 1); 

      // Check delegate isn't null -> can apply changes 
      if(delegate != nil){ 
       // Tell delegate about the update 
       self.delegate.updateEvent(at: result.inserted, event: self.events[result.inserted]); 
      } 
     } else { 
      // If last event is'nt seen -> Create a new one 
      // Get a basic event 
      let seen = BasicEvent; 
      // Set event type as seen 
      seen?.type = .seen; 
      // Get where this participant was added 
      let _ = seen?.addParticipant(id: (event?.creatorID)!, name: name!, image: image); 
      // Insert the new craeted seen event to events 
      self.events.append(seen!); 

      // Return where this user seen event was added 
      result = (removed: lastSeen, inserted: self.events.count - 1); 

      // Check delegate isn't null -> can apply changes 
      if(delegate != nil){ 
       // Tell delegate about the update 
       self.delegate.addEvent(at: result.inserted, event: event, animation: .fade); 
      } 
     } 
    } 
    // Handle user has sent a seen event before 
    else { 
     // Get where the targeted user has sent his last seen status 
     let seen = self.events[lastSeen]; 
     // Remove targeted user from his last seen status event 
     let _ = seen.removeParticipant(id: (event?.creatorID)!); 

     // If seen is'nt empty yet -> jus t remov current participant 
     if(seen.participants.count > 0){ 
      // Return where this user seen event was added 
      result = (removed: lastSeen, inserted: self.events.count - 1); 

      // Check delegate isn't null -> can apply changes 
      if(delegate != nil){ 
       // Tell delegate about the update 
       self.delegate.updateEvent(at: result.removed, event: self.events[result.inserted]); 
      } 
     } else { 
      // Delete empty seen event 
      self.events.remove(at: lastSeen); 

      // Return where this user seen event was added 
      result = (removed: lastSeen, inserted: self.events.count - 1); 

      // Check delegate isn't null -> can apply changes 
      if(delegate != nil){ 
       print("coount: \(delegate.getTableView().numberOfRows(inSection: 0)) | 2 "); 

       // Tell delegate about the update 
       self.delegate.deleteEvent(at: result.removed, event: self.events[result.removed]); 
      } 
     } 

     // Check if last event in group is seen 
     if(self.events.count > 0 && self.events.last?.type == .seen) { 
      // Add participant to last event 
      let _ = self.events.last?.addParticipant(id: (event?.creatorID)!, name: name!, image: image); 

      // Return where this user seen event was added 
      result = (removed: lastSeen, inserted: self.events.count - 1); 

      // Check delegate isn't null -> can apply changes 
      if(delegate != nil){ 
       // Tell delegate about the update 
       self.delegate.updateEvent(at: result.inserted, event: self.events[result.inserted]); 
      } 

     } else { 
      // Get a basic event 
      let seen = BasicEvent; 
      // Set event type as seen 
      seen?.type = .seen; 
      // Get where this participant was added 
      let _ = seen?.addParticipant(id: (event?.creatorID)!, name: name!, image: image); 
      // Insert the new craeted seen event to events 
      self.events.append(seen!); 

      // Return where this user seen event was added 
      result = (removed: lastSeen, inserted: self.events.count - 1) 

      // Check delegate isn't null -> can apply changes 
      if(delegate != nil){ 
       // Tell delegate about the update 
       self.delegate.addEvent(at: result.inserted, event: seen, animation: .fade); 
      } 
     } 
    } 

    if(delegate != nil){ 
     delegate.endUpdates(); 
    } 

    // Return final result of this insertion 
    return result; 
} 
+0

Löschen Sie Zeilen in Ihrer App? Vielleicht haben Sie die Zeile bereits gelöscht oder entfernt, bevor Sie Ihre Tabelle neu laden. Veröffentlichen Sie Ihren Code..so kann jemand den Fehler deutlich machen – cole

+0

@cole Ich habe meinen Code geschrieben, ich glaube nicht, dass ich gelöscht oder anderswo eingefügt habe. –

Antwort

0

Debug Ihre numberOfRowsInSection Methode, es immer noch 36 ist zurückkehrt, obwohl Sie 1 Zeile in uitable eingefügt

+0

Danke !, Ich habe das bemerkt, aber immer noch, kann nicht herausfinden, warum dieses Verhalten passiert. –

0

Debug es, könnten Sie verpassen Aktualisieren Sie Ihre Datenquelle, während Sie die Tabellenansicht aktualisieren.

+0

Vielen Dank, ich schon so oft, alles funktioniert wie erwartet, aber die Ausführung von Einfügen und Löschen auf UITableView wird nicht auf richtige Zeit/Reihenfolge aufgerufen. –

Verwandte Themen