我有一个可变的对象数组,每个对象都有多个属性,可以在详细视图中显示。
我已经设置了按属性搜索的功能,但它运行正常。它根据搜索到的字符显示过滤后的数组,但是当我在该过滤后的数组中滑动删除(尚未从搜索栏中取消)时,它会根据过滤后的数据库中的行和过滤后的数组中的对象进行删除。索引路径。
我使用相同的索引路径来删除主表中的行和相应的对象(都在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
与每个数组中的相同项目不匹配。
答案 0 :(得分:1)
为了清楚起见,我们假设personArray
和filteredArray
填充了类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
等进行游戏。