2

私は完全に動作する並べ替えられた NSMutableArray を持っていますが、オブジェクトを削除しようとするとアプリがクラッシュし、アプリをリロードすると正しいオブジェクトが削除されませんでした。

この機能を実装する前は問題なく機能していましたが、修正方法の手がかりがありませんでした。

配列からものを削除するために使用するコードは次のとおりです。

- (void) tableView:(UITableView *)tv commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if ( editingStyle == UITableViewCellEditingStyleDelete ) {
        Patient *thisPatient = [patients objectAtIndex:indexPath.row];
        [patients removeObjectAtIndex:indexPath.row];
        if (patients.count == 0) {
            [super setEditing:NO animated:YES];
            [self.tableView setEditing:NO animated:YES];
        }
        [self deletePatientFromDatabase:thisPatient.patientid];
        [tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    }
}

この行で停止しています:

[tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];

配列のソートに使用するコードは次のとおりです。

-(void) processForTableView:(NSMutableArray *)items {

    for (Patient *thisPatient in items) {
        NSString *firstCharacter = [thisPatient.patientName substringToIndex:1];
        if (![charIndex containsObject:firstCharacter]) {
            [charIndex addObject:firstCharacter];
            [charCount setObject:[NSNumber numberWithInt:1] forKey:firstCharacter];
        } else {
            [charCount setObject:[NSNumber numberWithInt:[[charCount objectForKey:firstCharacter] intValue] + 1] forKey:firstCharacter];
        }
    }
    charIndex = (NSMutableArray *) [charIndex sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
}
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"cell"];
        NSString *letter = [charIndex objectAtIndex:[indexPath section]];
        NSPredicate *search = [NSPredicate predicateWithFormat:@"patientName beginswith[cd] %@", letter];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"patientName" ascending:YES];

    NSArray *filteredArray = [[patients filteredArrayUsingPredicate:search] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    if ( nil == cell ) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    NSLog(@"indexPath.row = %d, patients.count = %d", indexPath.row, patients.count);
    Patient *thisPatient = [filteredArray objectAtIndex:[indexPath row]];
    cell.textLabel.text = [NSString stringWithFormat:@"%@ %@", thisPatient.patientName, thisPatient.patientSurname];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.textColor = [UIColor blackColor];
    if (self.editing) {
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }
    return cell;
}

これは、そうではないかもしれませんが、配列をソートするときに発生する非常に一般的なことだと思います。

さらにコードが必要な場合は言ってください

4

1 に答える 1

1

配列がソートされているため、必ずしもそうではありませんが、テーブルにデータを入力している配列が、オブジェクトを削除している配列と同じではないためです。

patients配列をどこでソートしていますか?実際のpatients配列はソートされていますか、それとも実際にはソートしていない tableView デリゲート メソッドでソートしていますpatientsか?

patientsこれは、削除したオブジェクトのインデックスが、実際の配列にあるインデックスと同じではないためです (1 つはソートされ、もう 1 つはソートされていないため)。このため、最初に間違ったオブジェクトを削除してからクラッシュします。これは、tableView が 1 つが削除されることを期待している (削除されるセルをアニメートできるようにするため) が、間違ったオブジェクトが削除されたためです。

于 2013-08-18T17:08:38.490 に答える