Как узнать строку из всего табличного представления, выбранного в поиске моего контроллера отображения поиска? - PullRequest
0 голосов
/ 29 февраля 2012

Как видно из названия, в моем коде при поиске в моем приложении это происходит просто:

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 (@ "Pushing ...");NSUInteger row = [indexPath row];// старый код перед просмотром поиска

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

РЕДАКТИРОВАТЬ: Теперь это работает для следующих случаев: со списком со всеми элементами он хорошо ищет, когда я начинаю искать, он работает хорошо, проблема в том, что когдапрекратить поиск, и я выбираю строку из списка всех элементов, в которых он до сих пор использует индекс индекса списка искомых элементов, это происходит потому, что в этом коде я изменяю логическую переменную поиска на 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 Ответ

1 голос
/ 29 февраля 2012

Если у вас есть объект, вы можете узнать его индекс в массиве.Используя ваш пример вверху:

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

Вы не захотите обрабатывать эти два оператора, если не выполняете поиск, поскольку они не имеют смысла.Чтобы остановить их обработку, вам потребуется поместить их в оператор if и проверить, выполнили ли вы поиск.

После просмотра вашей ошибки может показаться, что у вас есть массив с 1160 объектами иВаш код запрашивает объект 2147483647. Очевидно, что он не существует, и поэтому код падает.Почему вы получаете эту ошибку, я не совсем уверен, и это только то, что вы действительно можете ответить.Используйте точки останова и отладчик, чтобы узнать, где код работает неправильно.

...