如何使用搜索显示控制器从UITableView获取选定的行

时间:2012-11-02 16:19:46

标签: iphone uitableview uisearchdisplaycontroller didselectrowatindexpath

我的搜索显示视图控制器基于TableSearch

通常,下面的表达式会给出选定的索引行:

self.tableView.indexPathForSelectedRow.row

但是在搜索模式下,可以使用以下方法获取所选行:

self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow.row

我使用上面的索引在一些处理之后很快删除相应的行(来自我的后端数组) - 在didSelectRowAtIndexPath的末尾。我使用的数组是listContent和filteredListContent - 根据Apple示例。

我的问题是,在搜索模式下,我使用以下方法删除行:

[self.filteredListContent removeObjectAtIndex: self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow.row]

但是,与此同时,我还想从self.listContent中删除相同的对象,因为当我返回非搜索模式时,该行不应出现。

我在搜索结果视图中看到self.tableView.indexPathForSelectedRow.row不会定期更新。相反,它在我进入搜索结果视图之前给出了最后选择的行。

当然,我可以将一些内容放入我的数组对象中,以便可以交叉引用这两个索引。但除此之外还有其他有效的解决方案吗?我认为表视图应该有这种机制。

是的,我已经在我的viewWillAppear中跟进了以下内容:

   [self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];

1 个答案:

答案 0 :(得分:0)

这对我来说很好......

 #pragma mark - delete row
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {

        if(tableView == self.searchDisplayController.searchResultsTableView)
             // searching mode
        {
            // find row (index) from listContent
            arrayObject = [filteredlistContent objectAtIndex:indexPath.row];
            NSUInteger fooIndex = [listContent indexOfObject: arrayObject];
            NSLog(@"index listContent %u", fooIndex);
            //remove from listContent
            [self.listContent removeObjectAtIndex:fooIndex];
            [self.tableView reloadData];

            //remove from filteredlistContent
            [self.filteredlistContent removeObjectAtIndex:indexPath.row];
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        }
        else  //  tableView mode
        {
        [self.listContent removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
    }
}