我有一个表格,可以显示单个数组中的数据,并根据一组过滤器将项目组织到单独的部分中。每个过滤器都有相应的部分。我的UI允许用户点击每个表格单元格中嵌入的复选框。此复选框设置“已检查”标志,该标志会影响项目过滤到的哪个部分。这是一个例子:
点击项目A旁边的复选框会导致表格重新排列,如下所示:
以下是我的响应复选框点击的代码。它确定复选框属于哪一行,然后尝试创建一个动画块,从旧部分删除该行,并在“完成”部分的末尾添加一行。请记住,数组实际上并没有改变 - 数据被过滤到各个部分的方式会根据项目的已检查属性的值而发生变化。
- (IBAction)checkBoxTapped:(id)sender
{
// Get the table cell
CheckBoxControl* checkBox = (CheckBoxControl*)sender;
UITableViewCell* cell = (UITableViewCell*)[[sender superview] superview];
UITableView* table = (UITableView*)[cell superview];
NSIndexPath* indexPath = [table indexPathForCell:cell];
Item* item = [self itemAtRow:[indexPath row] inSection:[indexPath section]];
item.checked = checkBox.checked;
Filter* filter = [filters objectAtIndex:DONE_INDEX];
// We want the new row at the bottom of the "Done" section.
NSIndexPath* newIndexPath = [NSIndexPath indexPathForRow:[self countItemsWithFilter:filter] inSection:DONE_INDEX];
[table beginUpdates];
[table insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[table deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[table endUpdates];
}
此代码始终抛出异常:
2010-01-13 00:19:44.802 MyApp[19923:207] *** Terminating app due to uncaught
exception 'NSRangeException', reason:
'*** -[NSMutableIndexSet addIndexesInRange:]:Range {2147483647, 1}
exceeds maximum index value of NSNotFound - 1'
任何人都可以帮我弄清楚导致NSRangeException的原因吗?这是我的堆栈:
___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___
obj_exception_throw
+[NSException raise:format:arguments:]
+[NSException raise:format:]
-[NSMutableIndexSet addIndexesInRange:]
-[NSMutableIndexSet addIndex:]
-[_UITableViewUpdateSupport(Private) _computeRowUpdates]
-[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:oldRowRange:newRowRange:context:]
-[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:]
-[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:]
-[UITableView endUpdates]
-[RootViewController checkBoxTapped:]
如果此代码完全错误,那么我应该如何设置从一个部分删除行并将其添加到另一个部分的动画?
提前感谢您提供的任何帮助。
-Mike -
答案 0 :(得分:1)
好的,我想我找到了一个更好的方法。我决定为每个部分创建一个数组,而不是尝试使用过滤功能填充这些部分。每个部分的数组都包含数据源数组的索引。它看起来像这样:
NSArray* data = [[NSArray alloc] initWithObjects:@"Apple", @"Banana", @"Cat", @"Dog", nil]];
NSMutableArray* doneFilter = [[NSMutableArray alloc] init];
NSMutableArray* othersFilter = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithInt:0],
[NSNumber numberWithInt:1], [NSNumber numberWithInt:2],
[NSNumber numberWithInt:3], nil];
现在,当用户点击复选框时,我从othersFilter中删除项目的索引,并将其添加到doneFilter的底部。然后我删除并在表视图中添加相应的行。这似乎比我以前更稳定(没有抛出异常!!)并且还有一个额外的好处,就是允许过滤器自己订购。
答案 1 :(得分:0)
调用-insertRowsAtIndexPaths
和-deleteRowsAtIndexPaths
你只告诉UITableView用动画更新相应的行。因此,可能的问题是您还应根据更改更新数据源(例如-numberOfRowsInSection
必须返回实际值等。)