2012-04-03 21 views
1

Ich habe diesen Fehler beim Versuch, eine Zelle löschen, mit einer benutzerdefinierten Schaltfläche aufgetreten.Löschen Sie UITableViewCell mit benutzerdefinierten UIButton

* Beenden app aufgrund nicht abgefangene Ausnahme 'NSRangeException', Grund: '* - [__ NSArrayM removeObjectAtIndex:]: Index 1 über Grenzen [0 .. 0]'

Heres, wie mein Code ist strukturiert. Ich habe eine benutzerdefinierte UITableViewCell, die eine UIButton enthält, die eine Aktion hat, die die Zelle löscht. Die Aktion zum Löschen der Zelle befindet sich in meinem Hauptsicht-Controller, der die tatsächlichen indexPath für die Zellen enthält. Diese Struktur funktioniert gut.

Hier ist die Aktion zum Löschen der Zelle.

NSIndexPath *indexPath = [self globalIndexPath]; 

[self.array removeObjectAtIndex:[indexPath row]]; 
[db deleteTaskAtIndex:[indexPath row]]; 

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationFade]; 

Wenn ich die indexPath oben erklären, ist die globalIndexPath Eigenschaft in meinem cellForRowAtIndexPath, den Wert des ursprünglichen indexPath geben. So habe ich es erklärt.

[self setGlobalIndexPath:indexPath]; 

Jetzt habe ich einige NSLogs hier ein dort legte den indexPath loggt sein. Zum Beispiel in der viewWillAppear Methode und der viewDidLoad Methode, und beide geben mir die genaue indexPath, und ich überprüfte sogar die Ausgänge und alle von ihnen geben genaue Ergebnisse zurück, so dass ich wirklich nicht weiß, warum es mir den Fehler gibt.

Hier ist der Code in meiner benutzerdefinierten Zelle, um zu erkennen, wenn die Schaltfläche angetippt wird.

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
if (!notificationArray || !notificationArray.count) 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DeleteSignal" object:nil]; 
} 
else 
{ 
    UILocalNotification *notif = [notificationArray objectAtIndex:[checkbox tag]]; 
    [[UIApplication sharedApplication] cancelLocalNotification:notif]; 
} 

Und dann lösche ich die die Zelle die NSNotificationCenter mit dem Schlüssel DeleteSignal verwenden.

+0

Versuchen Sie, einen Haltepunkt festzulegen, wenn [indexPath-Zeile]> = [self.array count] vor jedem Entfernen ...oder eine Behauptung, dass die Reihe kleiner als die Anzahl ist. Auch, wenn Sie mehrere Elemente löschen, ohne die Tabelle zu aktualisieren? –

+0

Ich werde den Haltepunkt versuchen, aber ja, ich habe versucht, meine 'tableView' in meinem' viewDidLoad' und 'viewWillAppear' neu zu laden. – Souljacker

+0

Ich habe eine if-Anweisung direkt vor und nach meinen Löschfunktionen und ein Protokoll erstellt, aber ich weiß nicht genau, wie das funktioniert. – Souljacker

Antwort

1

Wenn Sie die globalIndexPath in cellForRowAtIndexPath (und nirgendwo sonst) einstellen, globalIndexpath wissen immer die indexPath für die letzte Zelle, die wurde erstellt oder aus der Warteschlange entfernt, nicht die, wo der Benutzer tatsächlich die Taste verwenden kann. Scheint schon vom Design gebrochen. Oder sind deine Zellen so groß, dass nur eine sichtbar ist?

Zuerst würde ich versuchen, den Tag Ihrer UIButton Ihrer Zelle Einstellung in cellForRowAtIndexPath

myButton.tag = indexPath.row + SOMEOFFSETTOASSUREYOURTAGDOESNTGET0; 

und dann über diesen Tag, um die indexPath in Ihrer Aktion zu erhalten:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(UIButton*)sender.tag - OFFSET inSection:0]; 

natürlich, dass nur funktioniert, wenn Sie nur einen Abschnitt haben. Wenn Sie mehrere Abschnitte bearbeiten müssen, können Sie ein Array verwenden, das alle Ihre IndexPfad enthält, und das Tag UIButton auf den Index dieses Indexpfads in Ihrem Array setzen.

UPDATE

Während es (mis) technisch möglich ist, verwenden NSNotificationCenter für das, was Sie tun, würde ich raten Sie wirklich durch diese tutorial zu gehen.

+0

meine Aktion ist in der Hauptansicht Controller, und es ist nur eine einfache 'void'. Ihr Code zum Deklarieren des 'indexPath' gibt einen Fehler zurück, der besagt, dass der Absender nicht deklariert ist. Soll es mein Knopf sein? – Souljacker

+0

Haben Sie ein Protokoll definiert und verwenden Sie einen Delegaten in Ihrer benutzerdefinierten 'UITableViewCell', um diese Aktion aufzurufen? –

+0

Und ja, Absender sollte Ihre UIButton sein. –

Verwandte Themen