2011-01-12 7 views
3

Ich habe eine benutzerdefinierte UITableViewCell, die zwei benutzerdefinierte UIButton hinzugefügt hat. Auf einer dieser Schaltflächen möchte ich die Zellenzeile aus myMethod() löschen können.Aufruf (deleteRowsAtIndexPaths) außerhalb von (commitEditingStyle) in Objective-C für das iPhone

Das Verfahren wird durch addTarget:@selector(myMethod:) innerhalb cellForRowAtIndexPath genannt:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 
    cell.acceptButton.tag = indexPath.row; 
    [cell.contentView addSubview:acceptButton]; 

    [cell.acceptButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside]; 
} 

Dies funktioniert, wird die aktuelle Methode erfolgreich aufgerufen.

- (void)myMethod:(id)sender { 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; //works fine (correct indexPath is returned) 
    friendsArray removeObjectAtIndex:indexPath.row]; //works fine (correct indexPath.row is returned and the object is removed from the array) 
    [tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; //throws error below 
} 

Fehler:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSArray initWithObjects:count:]: attempt to insert nil object at objects[0]' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x020a9be9 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x021fe5c2 objc_exception_throw + 47 
2 CoreFoundation      0x01ff3ffe -[__NSPlaceholderArray initWithObjects:count:] + 494 
3 CoreFoundation      0x020158a3 +[NSArray arrayWithObject:] + 67 
4 MyApp       0x00071d1b -[FriendListViewController myMethod:] + 417 
5 MyApp       0x00020b87 -[MBProgressHUD launchExecution] + 151 
6 Foundation       0x004a3d4c -[NSThread main] + 81 
7 Foundation       0x004a3cd8 __NSThread__main__ + 1387 
8 libSystem.B.dylib     0x9461f85d _pthread_start + 345 
9 libSystem.B.dylib     0x9461f6e2 thread_start + 34 

Normalerweise würde ich dies tun, wenn eine Zeile innerhalb einer Zelle zu löschen. Dies funktioniert gut:

- (void)tableView:(UITableView *)tableview commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
if(editingStyle == UITableViewCellEditingStyleDelete) { 
    //Delete the object from the friends array and the table. 
    [friendsArray removeObjectAtIndex:indexPath.row]; 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
} 
+0

mind addieren die Lösung? Ich bin gerade auf ein ähnliches Problem gestoßen. – Nyth

Antwort

0

, wenn Sie eine UIButton auf jeder Zelle oder mehr als eine Zelle verwenden und einen gleichen Wähler als die beste Option Einstellung der Zelle durch Verwendung von Tags, um herauszufinden ist.

ich tat dies, wenn ich die Farbe meiner Zubehörknöpfe zu Grün ändern möchte (ich weiß nicht, ob Apfel das oder nicht erlaubt, aber gerade etwas, das ich versuchen möchte). Also machte ich einen benutzerdefinierten Button und änderte sein Hintergrundbild in grün und dann fügte ich im accessoryView diesen Button hinzu. Und es hat gut funktioniert. Sie müssen das Tag in tableView:cellForRowAtIndexPath: Methode

+0

Ich habe tatsächlich gefunden, was das Problem ist. Wenn die tatsächliche Zeile nicht ausgewählt ist, wird in derselben Zeile ein Fehler ausgegeben. Wenn es ausgewählt ist, funktioniert es gut. Gibt es eine andere Möglichkeit, die Zeile zu löschen, ohne dass sie tatsächlich ausgewählt wird? – fuzz

+0

Ja, ich meinte nur – Robin

+0

@robin: indexPath ist ein NSIndexPath-Objekt, nicht die Zeilennummer. @Fulvio: Wenn Sie eine nicht ausgewählte Zeile löschen möchten, müssen Sie bereits wissen, wie der Indexpfad der Zelle lautet. UITableView verfügt über Methoden, um den Indexpfad einer Zelle für das Zellenobjekt oder einen Punkt auf dem Bildschirm innerhalb der Zelle abzurufen. – ughoavgfhw

0

festlegen Das Problem besteht in Array-Initialisierung, nicht Zeile löschen. Versuchen Sie, diese Methode noch einmal zu debuggen, und überprüfen Sie, ob IndexPath null sein kann.

+0

Es ist nicht Null und das Array wird ordnungsgemäß initialisiert. – fuzz

+0

@Fulvio: naja, Laufzeit stimmt nicht mit dir überein: '*** - [NSArray initWithObjects: count:]: versuche nil object an objects [0]' einzufügen – kovpas

+0

Das Problem ist in der commitEditingStyle Methode, da es INSIDE iOS libs abstürzt. – AlexeyVMP