【问题标题】:How to know the row from the whole tableview selected in a search of my Search Display Controller?如何知道在搜索我的搜索显示控制器时选择的整个 tableview 中的行?
【发布时间】:2012-03-18 08:13:35
【问题描述】:

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

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 行 = [indexPath 行]; //搜索视图之前的旧代码

    //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/

【问题讨论】:

    标签: iphone objective-c ios uitableview uisearchdisplaycontroller


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这个东西有效,唯一的问题是当我选择一行而不搜索任何内容时,这会出错,这是我保存行 NSUInteger row = [indexPath row]; 的一段代码//选择的行,在我放置搜索控制器之前制作 //如果我浏览过任何东西 id searchResult = [searchResults objectAtIndex:row]; int indexForResult = [ListaEstaciones indexOfObject:searchResult];有什么建议吗?
    • 它给出了什么错误?这段代码要去哪里?如果您有这样长的回复,最好编辑您的问题:)
    • 问题很简单,当我选择一行而不搜索时,执行的代码行:id searchresult = [searchResults objectAtIndex: row];是一个错误,因为不是任何搜索结果。关于如何检测我是否搜索过或其他解决方案的任何建议?非常感谢您在这个问题上花费的时间。
    • 没错。我会创建一个名为 search 的实例变量。当用户开始搜索时设置searching = YES。然后在处理水龙头时检查它:)
    • 我应该在哪里声明搜索?里面 shouldReloadTableForSearchScope、shouldReloadTableForSearchString、filterContentForSearchText 函数?如果我在它们上声明该变量对 didSelectRowAtIndexPath 不可见
    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多