我使用此页面在表格上构建了一个复选框功能:
http://www.carrotcoded.com/2012/12/02/uibutton-within-uitableviewcell-checkbox/
这很好用,我可以选中和取消选中复选框。然后我用创建的委托“clearCheckedItems”清除所有这些。这个方法有一个循环来将未选中的项目添加到新的 Glist 中,并构建一个已删除索引的数组。
方法 0,“beginUpdates”方法:将索引列表传递给 removeRows 方法,但由于“错误的选择器”而崩溃,NSLog 显示在底部。
方法 1,“reloadView” 方法:删除选中的行,不会崩溃,但会留下一个持久的“选中”复选框图形,即“幽灵”,它不再指示该表格单元格的状态。
//////////////// start of code //////////////////////////
- (IBAction)clearCheckedItems:(id)sender {
groceryList *myGroceryList = [ groceryList sharedSingleton ];
gList = [[NSMutableArray alloc] init ];
gList = myGroceryList.myGroceryListS ;
int i;
NSMutableArray *checkedOffGlist = [[NSMutableArray alloc] init ];
NSMutableArray *removedIndexArray = [[ NSMutableArray alloc] init ];
for ( i=0 ; i < sizeOfList ; i++) {
groceryItem *current = [ gList objectAtIndex:i ];
if ( current.bought == (bool )NO ) {
[ checkedOffGlist addObject:current ] ;
} else {
[ removedIndexArray addObject:[ NSNumber numberWithInt:i ] ] ;
}
}
myGroceryList.myGroceryListS = checkedOffGlist ;
//* update the table, clear all the check boxes *//
NSString *whichTableUpdate = @"beginUpdates";
//* beginUpdates method *//
if ( [whichTableUpdate isEqualToString:@"beginUpdates" ]) {
[ self.tableView beginUpdates];
[ self.tableView deleteRowsAtIndexPaths:
[NSArray arrayWithObject:removedIndexArray ]
withRowAnimation:UITableViewRowAnimationAutomatic ];
[ self.tableView endUpdates];
// *** fails with message below *** //
} else {
//* reloadView method *//
[ self.tableView reloadData ];
// *** does not crash, but leaves behind a persistent "checked" box icon.
}
}
2013-06-18 09:32:32.843 杂货清单 [5730:c07] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayM 行]:无法识别的选择器发送到实例 0x717cb30”*第一次抛出调用堆栈:
..cb30 是指向已删除索引列表“removedIndexArray”的指针。
所以……我如何为行移除器获取正确的索引列表,或者我是否错误地运行了行移除方法?