Использование панели поиска с основными данными - PullRequest
1 голос
/ 25 октября 2011

Я пробовал различные методы, и это самый близкий, который я получил, но обновление таблицы делает все записи за пределами экрана пустыми, и когда я прокручиваю, они все пропадают. Я все еще новичок и не совсем уверен в том, чтобы вообще выполнить поиск по таблице основных данных.

Если я не обнуляю что-то, он умирает здесь:

ОБНОВЛЕНИЕ: это то, что я пытаюсь сейчас, и я получаю тот же сбой: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no section at index 1'

`Recipe *recipe = (Recipe *)[fetchedResultsController objectAtIndexPath:indexPath];` **`Thread 1 received signal SIGABRT`**


#pragma mark -
#pragma mark search bar methods
- (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSLog(@"searched");
    fetchedResultsController = nil;       
    //============
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];

    if (searchBar.text !=nil) {
        NSPredicate *predicate =[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchBar.text];
        [fetchedResultsController.fetchRequest setPredicate:predicate];
    } else {
        NSPredicate *predicate =[NSPredicate predicateWithFormat:@"All"];
        [fetchedResultsController.fetchRequest setPredicate:predicate];
    }

    [fetchRequest setEntity:entity];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES];// was name
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor,sortDescriptor2, nil];// was 2

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"state" cacheName:@"Root"];//@"state"
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptor2 release];
    [sortDescriptors release];
    //==============

    // dismiss the search keyboard
    [searchBar resignFirstResponder];

    // reload the table view
    //[self.tableView reloadData];

}


- (void)configureCell:(RecipeTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    // Configure the cell //DIES HERE
    Recipe *recipe = (Recipe *)[fetchedResultsController objectAtIndexPath:indexPath];
    cell.recipe = recipe;
}

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

Спасибо за любые рекомендации или помощь в понимании и решении этой проблемы!

Rob

tableViewController.m

- (NSFetchedResultsController *)fetchedResultsController {
    if (fetchedResultsController == nil) {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];

        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES];// was name
        NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor,sortDescriptor2, nil];// was 2

        [fetchRequest setSortDescriptors:sortDescriptors];

        // Edit the section name key path and cache name if appropriate.
        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"state" cacheName:@"Root"];//@"state"
        aFetchedResultsController.delegate = self;
        self.fetchedResultsController = aFetchedResultsController;

        [aFetchedResultsController release];
        [fetchRequest release];
        [sortDescriptor release];
        [sortDescriptor2 release];
        [sortDescriptors release];
    }
    return fetchedResultsController;
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    self.fetchedResultsController = nil;

    self.searchBar.text=@"";

    [self.searchBar setShowsCancelButton:NO animated:YES];
    [self.searchBar resignFirstResponder];
    //self.tableView.allowsSelection = YES;
    //self.tableView.scrollEnabled = YES;
}
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    // added 2 below
    //self.fetchedResultsController.delegate = nil;
    self.fetchedResultsController = nil;
    [self.searchBar setShowsCancelButton:YES animated:YES];
    //self.tableView.allowsSelection = NO;
    //self.tableView.scrollEnabled = NO;
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    // added 2 below
    //self.fetchedResultsController.delegate = nil;
    self.fetchedResultsController = nil;
    NSLog(@"fetchObjects");
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    // Edit the sort key as appropriate.
    //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES];// was name
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

    //NSLog(@"NSInteger value :%@", sortDescriptor);
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor2, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // perform query
    NSString *query = self.searchBar.text;
    if (query && query.length) fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", query];


    // Edit the section name key path and cache name if appropriate.
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"state" cacheName:@"Root"];//@"state"
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    //[sortDescriptor release];
    [sortDescriptor2 release];
    [sortDescriptors release];
    //[self.tableView reloadData];
}   

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates.
    [self.tableView beginUpdates];
}

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Используете ли вы UISearchDisplayController?если у вас есть две таблицы: одна отображает ваши обычные вещи, а другая связана с поиском.Вы должны обрабатывать таблицы отдельно.

Существует запись всего кода, необходимого для поиска в таблицах, по адресу Как фильтровать NSFetchedResultsController (CoreData) с помощью UISearchDisplayController / UISearchBar

1 голос
/ 25 октября 2011

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

После создания экземпляра вы вызываете executeFetch: для фактического выполнения выборки.

...