Основные данные, контроллер поиска и табличное представление - PullRequest
1 голос
/ 07 марта 2011

Я интегрировал функцию поиска в свое приложение для запроса основных данных / .sqlite, и она работает нормально.Но у меня есть проблема, и я не уверен, на какую конфигурацию классов мне следует взглянуть. Может, кто-то укажет мне на свет, спасибо

В основном моя модель такая

TableView 1
Показать категорию продукта
selectRow -> TableView2

TableView 2
Показать продукты выбранной категории
selectRow -> TableView3

Поскольку я интегрировал UISearchBar в TableView 1 , я хотел бы иметь функцию, когда люди ищут продукт, который они хотят, и он будет сразу отображать название продукта в представлении таблицы.,Я пытался, но результат показывает Категория , которая содержит "искомый продукт".

Итак, как я могу заставить это правильно отображаться и на какой раздел конфигурации мне смотреть?

    UISearchDisplayController *searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];  

[self performSelector:@selector(setSearchDisplayController:) withObject:searchDisplayController];

[searchDisplayController setDelegate:self];  
[searchDisplayController setSearchResultsDataSource:self];  
[searchDisplayController setSearchResultsDelegate:self];
[searchDisplayController release];  
[self.tableView setContentOffset:CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height)];

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();

    self.filteredListContent = [NSMutableArray arrayWithCapacity:[[[self fetchedResultsController] fetchedObjects] count]];
}   

Это часть кода?
Спасибо

Обновление с дополнительной информацией:

Настройка ячейки

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *entity = nil;
if (self.searchIsActive){  // Configure the cell to show the searched item's name  
entity = [[self filteredListContent] objectAtIndex:[indexPath row]];
cell.textLabel.textColor = [UIColor blackColor];
} else {// Configure the cell to show the category's name 
cell.textLabel.textColor = [UIColor blackColor];  
entity = [fetchedResultsController objectAtIndexPath:indexPath]; 
} 
cell.textLabel.text = [entity valueForKey:@"nameEN"]; 
}  

Предикат поиска

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"ANY products.nameEN CONTAINS[cd] %@", searchText];
self.filteredListContent = [[[self fetchedResultsController] fetchedObjects] filteredArrayUsingPredicate:predicate];
}

Базовая структура данных

Category{  
    nameEN  
    products <- one to many relation ->> Product.productcat
}

Product{ 
    nameEN  
    spec  
    productcat <<-- many to one relation-> Category.products
}

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Если ваша модель данных имеет сущность Product и сущность Category и ваши выборки возвращают Category объекты вместо Product объектов, то для вашей выборки установлена ​​неправильная сущность.

[ игнорировать следующие, поскольку это относится к другому типу поиска - techzen] Обычно вы создаете отдельную выборку для поиска, потому что каждый раз, когда пользователи вводят новые символы впоиск, предикат для выборки должен измениться.

Обновление:

Хорошо, я неправильно понял тип поиска, который вы выполняли.Вы фильтруете возврат существующей выборки вместо выборки на основе введенного поиска.

Глядя на предикат и модель данных в вашем обновлении, я думаю, что ясно, что предикат будет работать только с массивом Category объектов.Это:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"ANY products.nameEN CONTAINS[cd] %@", searchText];

... может фильтровать только Category объекты, поскольку только у объекта Category есть атрибут products.Этот предикат говорит: «Сопоставьте все объекты Catergory, в которых любой связанный объект Product имеет значение атрибута nameEn, содержащее текст поиска».

Помните также, что фильтруемый здесь массив:

self.filteredListContent = [[[self fetchedResultsController] fetchedObjects] filteredArrayUsingPredicate:predicate];

... - это массив Category объектов, а не Product объектов.

Я думаю, вам нужно переосмыслить дизайн вашего интерфейса.По умолчанию для вашего TableView1 отображается список Category объектов, но вы хотите, чтобы при поиске по этой таблице отображался список Product объектов.Это запутает пользователя.Пользователь будет ожидать, что поиск по таблице Category объектов вернет подмножество Category объектов.

Однако в существующем проекте вы можете создать массив объектов Product с текущим кодом, создав новый массив объектов Product, применив оператор коллекции @distinctUnionOfObjects:

self.filteredListContent = [[[self fetchedResultsController] fetchedObjects] filteredArrayUsingPredicate:predicate];
    NSArray *distinctProducts=[self.filteredListContent valueForKey:@"products.@distinctUnionOfObjects.enName"];

... distinctProducts теперь будет массивом Product объектов, соответствующих критериям поиска.Используйте этот массив в configureCell:atIndexPath (вам может понадобиться прибегнуть к нему.)

0 голосов
/ 09 марта 2011

Итак, я попробовал их в части настройки ячейки

        NSDictionary *distinctProducts=[self.filteredListContent valueForKey:@"products"];
    NSLog(@"what are products:%@",distinctProducts);
    NSArray *listofProductsName = [distinctProducts valueForKey:@"nameEN"];
    NSLog(@"whatup: %@",listofProductsName);
    NSArray *entity = [listofProductsName objectAtIndex:indexPath.row];
    cell.textLabel.textColor = [UIColor blackColor];
    cell.textLabel.text = entity;  

Но тогда я мог бы преобразовать имя, чтобы показать ... он сказал _NFSet isEqualToString: .... и т. Д. Прервал NSException ... хотя NSLog listofProductsName показывает правильный список названий продуктов.

...