我有两个要素:
NSMutableArray* mruItems;
NSArray* mruSearchItems;
我有UITableView
基本上保存mruSearchItems
,一旦用户滑动并删除特定行,我需要在mruItems
内找到该字符串的所有匹配项并删除他们来自那里。
我没有充分使用NSMutableArray,我的代码因某些原因给我错误:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//add code here for when you hit delete
NSInteger i;
i=0;
for (id element in self.mruItems) {
if ([(NSString *)element isEqualToString:[self.mruSearchItems objectAtIndex:indexPath.row]]) {
[self.mruItems removeObjectAtIndex:i];
}
else
{
i++;
}
}
[self.searchTableView reloadData];
}
}
错误: 我现在看到一些字符串不在引号之间(尽管是UTF8中的字符串)
Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x1a10e0> was mutated while being enumerated.(
"\U05de\U05e7\U05dc\U05d3\U05ea",
"\U05de\U05d7\U05e9\U05d1\U05d5\U05df",
"\U05db\U05d5\U05e0\U05df",
"\U05d1 ",
"\U05d1 ",
"\U05d1 ",
"\U05d1 ",
Jack,
Beans,
Cigarettes
)'
答案 0 :(得分:6)
您得到一个例外,因为您在迭代其元素时正在改变容器。
removeObject:
完全符合您的要求:删除与参数相等的所有对象。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle != UITableViewCellEditingStyleDelete)
return;
NSString *searchString = [self.mruSearchItems objectAtIndex:indexPath.row];
[self.mruItems removeObject:searchString];
[self.searchTableView reloadData];
}
答案 1 :(得分:4)
在枚举时不能编辑集合,而是将索引存储起来,然后通过循环遍历索引数组来删除它们。