从已过滤的阵列和主阵列中删除相同的对象

时间:2018-03-18 18:42:26

标签: ios objective-c arrays uitableview

我有一个可变的对象数组,每个对象都有多个属性,可以在详细视图中显示。

我已经设置了按属性搜索的功能,但它运行正常。它根据搜索到的字符显示过滤后的数组,但是当我在该过滤后的数组中滑动删除(尚未从搜索栏中取消)时,它会根据过滤后的数据库中的行和过滤后的数组中的对象进行删除。索引路径。

我使用相同的索引路径来删除主表中的行和相应的对象(都在commitEditingStyle内),但是你可能会看到过滤器上某个对象的indexPath.row可变数组不一定与主可变数组上使用相同indexPath的同一对象相对应。 (例如,如果主阵列是Bob,Jamie,Sarah,Tom和我搜索“To”,Tom会在索引0处显示,因此当我尝试删除Tom时,它会删除主阵列中的Bob。)< / p>

我希望用户能够从搜索内容中删除项目,并从数组和表中删除相同的项目及其属性。 直接从主表视图和数组正常删除工作正常。这是代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle: 
    (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath: 
    (NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        if (isFiltered == YES) {
            // Then we are in filtered search results, delete from both arrays and table views

           [self.personArray removeObjectAtIndex:indexPath.row]
           [self.filteredArray removeObjectAtIndex:indexPath.row]
           [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    }   else {     // normal table view, just remove at master array and table view

           [self.personArray removeObjectAtIndex:indexPath.row]
           [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    }
  }
}

您可能会看到indexPath.row与每个数组中的相同项目不匹配。

1 个答案:

答案 0 :(得分:1)

为了清楚起见,我们假设personArrayfilteredArray填充了类MyPerson的对象。

假设我们没有过滤首发:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeue...];
    MyPerson *person = [self.personArray objectAtIndex:indexPath.row];
    cell...configureWithThatPerson
    return cell;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
         [self.personArray removeObjectAtIndex:indexPath.row];
         [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

在伪代码中你应该在逻辑部分做什么(deletePerson:on:不存在):

MyPerson *personToDelete = [self.personArray objectAtIndex:indexPath.row];
[self deletePerson:personToDelete on:self.personArray];

当然这简化了(因为你已经知道了索引):

[self.personArray removeObjectAtIndex:indexPath.row];

所以保持这个逻辑:

MyPerson *personToDelete = [self.filteredArray objectAtIndex:indexPath.row];
[self deletePerson:personToDelete on:self.personArray];
[self deletePerson:personToDelete on:self.filteredArray];

现在实施deletePerson:on:有不同的可能性:
•在self.personArray中找到该对象的索引(如果它们是重复的各种索引?是你的情况)filteredArray显然indexPath.row它是NSPredicate。并将其删除 •使用isEqual:对其进行过滤。

在所有情况下,您可能需要或不需要实施MyPerson,具体取决于解决方案,但您必须知道区分两个indexOfObject:对象的区别:
它的所有属性都是平等的吗?
您可以查看唯一标识符吗?
只有名字上的匹配?等

然后您可以使用indexOfObjectPassingTest:Model等进行游戏。