如何知道在搜索我的搜索显示控制器时选择的整个tableview中的行?

时间:2012-02-28 20:14:49

标签: iphone objective-c ios uitableview uisearchdisplaycontroller

正如标题所说,在我的代码中,当我在我的应用中搜索时,会以一种简单的方式发生这种情况:

stations = [barcelona, madrid, valencia, badajoz]

当我输入“ba”时,它会显示:

mysearch = [barcelona, badajoz]

我想选择badajoz,所以程序返回该行是位置1,而在站中是位置编号3。

有什么想法吗?

PD:与搜索相关的代码

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate 
                                    predicateWithFormat:@"SELF contains[cd] %@",
                                    searchText];

    self.searchResults = [self.allItems filteredArrayUsingPredicate:resultPredicate];
}

#pragma mark - UISearchDisplayController delegate methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString 
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] 
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:searchOption]];
    return YES;
}

编辑:我使用下面的答案编辑了我的代码      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {         的NSLog(@ “推......”);         NSUInteger row = [indexPath row]; //搜索视图前的旧代码

    //index from the search
    id searchResult = [searchResults objectAtIndex:row];
    int indexForResult = [ListaEstaciones indexOfObject:searchResult];
    //more stuff

编辑: 现在它适用于这种情况:列表包含所有元素,它搜索得很好,当我开始搜索时效果很好,问题是当停止搜索并选择所有元素列表的一行时,它仍然使用de index之前搜索到的项目列表,这是因为在这段代码中我将搜索布尔变量更改为YES:

    - (void)filterContentForSearchText:(NSString*)searchText 
                             scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate 
                                    predicateWithFormat:@"SELF contains[cd] %@",
                                    searchText];

    self.searchResults = [self.allItems filteredArrayUsingPredicate:resultPredicate];
    searching = YES;

但是当我返回所有值列表时,我不知道在哪里将搜索值更改为NO。有什么建议?非常感谢。 编辑2:解决了这个网站http://engineeringtheworld.wordpress.com/2011/04/11/detecting-when-clear-is-clicked-in-uisearchbar-x-button/

1 个答案:

答案 0 :(得分:1)

如果你有一个对象,你可以在一个数组中找到它的索引。在顶部使用您的示例:

id searchResult = [mysearch objectAtIndex:1];
int indexForResult = [stations indexOfObject:searchResult];

如果你没有进行搜索,你不会想要处理这两个语句,因为它们没有意义。要阻止它们进行处理,需要将它们放在if语句中,并检查是否进行了搜索。

看了你的错误后,似乎你有一个包含1160个对象的数组,你的代码要求对象2147483647.这显然不存在,所以代码崩溃了。为什么你会得到这个错误我不完全确定,只有你能真正回答。使用断点和调试器来找出代码出错的地方。