排序数组不会删除我想要的内容

时间:2013-08-18 17:04:46

标签: iphone ios objective-c tableview sorted

我有一个排序的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;
}

我怀疑当你对一个数组进行排序时会发生这种情况很常见,尽管它可能不是。

请说明是否需要更多代码

1 个答案:

答案 0 :(得分:1)

这不是必需的,因为您的数组已排序,但因为您填充表的数组与要从中删除对象的数组不同。

您在哪里对patients数组进行排序?实际的patients数组是排序的还是你在tableView委托方法中对它进行排序而不是实际排序patients

这样做的原因是您删除的对象的索引与它在实际patients数组中的索引不同(因为一个是排序的,一个不是)。因此,它首先删除了错误的对象,然后它崩溃了,因为tableView期望删除一个(这样它可以动画那个被删除的单元格)但是错误的一个被删除了。