searchDisplayController не отображает результаты, если язык iphone не является английским - PullRequest
6 голосов
/ 09 января 2012

У меня есть searchDisplayController, который отлично работает при поиске английских и арабских слов, используя следующий метод:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSInteger)scope
{
    NSString *query = self.searchDisplayController.searchBar.text;

    if (query && query.length) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ClientName contains[cd] %@", query]; 
        [searchResultController_.fetchRequest setPredicate:predicate];       
    }

    NSError *error = nil;
    if (![[self searchResultController] performFetch:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }      
}

Однако, это нормально работает, если язык iphone английский, но если я изменяюс языка iPhone на арабский (глобальные настройки) и при попытке поиска по арабским или английским словам searchResultsController не будет отображать результаты, почему?

ps, когда я помещаю в запрос статическое арабское слово, например: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ClientName contains[cd] %@", @"تجريب"]; searchDisplayController будет отображать правильный результат арабского слова تجريب

РЕДАКТИРОВАТЬ: я пытался построить предикат в коде, как это:

    NSExpression *clientNameEx=[NSExpression expressionForKeyPath:@"ClientName"];
    NSExpression *aClientEx=[NSExpression expressionForConstantValue:query];
    NSPredicate *predicate=[NSComparisonPredicate predicateWithLeftExpression:clientNameEx
                                                             rightExpression:aClientEx 
                                                                    modifier:NSDirectPredicateModifier
                                                                        type:NSContainsPredicateOperatorType
                                                                     options:0];

, но нетбез ...

Ответы [ 2 ]

1 голос
/ 13 января 2012

Я только что нашел эту статью , и она напомнила мне ваш вопрос.Может быть, вы можете использовать это решение?

1 голос
/ 13 января 2012

Я создал тестовый проект с XCode 4, шаблоном MasterDetail, установил флажок CoreData и добавил SearchBarController в основное представление по умолчанию, добавил делегат UISearchBarDelegate в заголовок и нажал метод searchBarTextDidEndEditing для вызова поиска после того, как сделано.

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
    [NSFetchedResultsController deleteCacheWithName:nil];
    self.fetchedResultsController = nil;
    [self.tableView reloadData];
}

Последним шагом было добавление в fetchedResultsController:

NSString *query = self.searchDisplayController.searchBar.text;
if (query.length) {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp contains[cd] %@", query];
    NSLog(@"predicate %@", [predicate description]);
    [fetchRequest setPredicate:predicate];
}

Включил iPhone Simulator и протестировал его с настройками iOS5 и арабского языка.Все успешные поиски, поиск по слову «тест» и «تجريب» приводит к результатам.Тем не менее, слово «تجريب» было скопировано из вашего вопроса, так как мой арабский язык немного заржавел :). Я также пытался сделать запись в базе данных с первой буквой на арабской клавиатуре, а затем найти ее и показать результат.

...