3

私は2つの要素を持っています:

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
)'
4

2 に答える 2

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];
}
于 2012-07-11T23:23:24.583 に答える
4

コレクションを列挙しながら編集することはできません。代わりに、インデックスを保存してから、インデックスの配列をループして削除します。

于 2012-07-11T22:40:18.840 に答える