コアデータiPhoneで検索を実装する

私は、コアデータデータベースを検索する機能を追加したいと思います。
私はカスタムセルを持つテーブルビューを持っていますが、それらはわずか8であり、編集可能ではありません。
さて、searchDisplayControllerを持つsearchBarをtableViewのheaderViewに追加し、検索データを管理するために NSFetchedResultsController を使用したいと思います。
私はこのコードを書こうとしましたが、動作しません...

-(void)createSearch
{
    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    searchBar.delegate = self;
    searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"All", @"Title", @"Notes", @"Tags", nil];
    searchBar.showsScopeBar = YES;
    self.tableView.tableHeaderView = searchBar;
    [searchBar setBackgroundImage:[UIImage imageNamed:@"navbarBg"]];

    searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    searchController.delegate = self;
    searchController.searchResultsDataSource = self;
    searchController.searchResultsDelegate = self;
}

-(NSFetchedResultsController *)searchResultsController
{
    if (searchResultsController != nil)
    {
        return searchResultsController;
    }

    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Task"];
    [request setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
    NSArray *descriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:descriptors];

    NSFetchedResultsController *afrc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    afrc.delegate = self;
    searchResultsController = afrc;

    return searchResultsController;
}

-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    [self.searchController.searchResultsTableView beginUpdates];
}

-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.searchController.searchResultsTableView;

    switch(type) 
    {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[self tableView:tableView cellForRowAtIndexPath:indexPath] toIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

-(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    UITableView *tableView = self.searchController.searchResultsTableView;

    switch (type)
    {
        case NSFetchedResultsChangeInsert:
            [tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.searchController.searchResultsTableView endUpdates];
}

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSPredicate *predicate = nil;

    if (self.searchController.searchBar.selectedScopeButtonIndex == 0)
    {
        predicate = [NSPredicate predicateWithFormat:@"1=1"];
    }
    else if (self.searchController.searchBar.selectedScopeButtonIndex == 1)
    {
        predicate = [NSPredicate predicateWithFormat:@"title CONTAINS[c] %@", searchText];
    }
    else if (self.searchController.searchBar.selectedScopeButtonIndex == 2)
    {
        predicate = [NSPredicate predicateWithFormat:@"notes CONTAINS[c] %@", searchText];
    }
    /*else
    {
        predicate = [NSPredicate predicateWithFormat:@"tags
    }*/

    [self.searchResultsController.fetchRequest setPredicate:predicate];

    [self.searchController.searchResultsTableView reloadData];
}

これらはtableViewデリゲートとdataSourceメソッドです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if (tableView == self.searchController.searchResultsTableView)
    {
        return [[self.searchResultsController sections] count];
    }
    else
    {
        return 1;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchController.searchResultsTableView)
    {
        id  sectionInfo = [[self.searchResultsController sections] objectAtIndex:section];
        return [sectionInfo numberOfObjects];
    }
    else
    {
        return 8;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.searchController.searchResultsTableView)
    {
        static NSString *SearchCellIdentifier = @"SearchCell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SearchCellIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SearchCellIdentifier];
        }

        [self configureCell:cell toIndexPath:indexPath];

        return cell;
    }
    else
    {
        static NSString *CellIdentifier = @"Cell";

        MainTableCell *cell = (MainTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[MainTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessoryView"]];
        }

        [self configureCell:cell fromArray:cellImages toIndexPath:indexPath];

        return cell;
    }
}

それはなぜ機能しないのですか?

どうもありがとうございます ;)

0
「動作しません」と指定します。
追加された 著者 tobiasbayer,
私はエラーは出ませんが、手紙や単語を書こうとすると、述語でフィルタリングされたタスクの代わりに、すべてのタスクが表示されます
追加された 著者 matteodv,

1 答え

あなたのsearchBarの終わりに:textDidChange:reloadDataを呼び出す直前のメッセージ:

[searchResultsController release]; searchResultsController = nil;

0
追加された
ええ、私はあなたの答えを読んでいますが、私の状況では、私は2つのNSFetchedResultsControllerを必要としません。
追加された 著者 matteodv,
いいえ、私は試していないが、私はあなたが何を言いたいのかよく理解していない...あなたは私を説明することができますか?ありがとうございました ;)
追加された 著者 matteodv,
あなたのFECを叩いて試してみたことがありますか? FRCを構築した後で変更できるのはほんのわずかです。
追加された 著者 Brent Priddy,