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;
}
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
@cole Ich habe meinen Code geschrieben, ich glaube nicht, dass ich gelöscht oder anderswo eingefügt habe. –