2011-10-25 14 views
1

私はさまざまな方法を試しましたが、これは私が得た最も近いものですが、テーブルを更新するとすべてのエントリが空白になり、スクロールするとすべて空白になります。私はまだ新しく、コアデータテーブルビューでの検索の実装については完全にはわかりません。コアデータを持つ検索バーを使用

私がnil物事をしない場合、それはここで死ぬ:

UPDATE:これは私が今しようとしていますものです、と私は同じクラッシュ取得しています:では 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; 
} 

をそれ以外の条件では、テーブルを上下に動かすと死ぬ。

この問題を理解し解決するための助けを借りてくれてありがとう!

ロブ

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; 

    [email protected]""; 

    [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]; 
} 

答えて

1

あなたが実際にフェッチ要求を実行しないようにそれは見えません。

インスタンスを作成したら、あなたはperformFetchを起動します:docsから実際に にフェッチを実行します。

+0

でテーブルの上に検索を実装するために必要なすべてのコードの過去記事があり

:エラーNSError '*は、 BOOL成功= [fetchedResultsController performFetch:&error]; '? – roberthuttinger

+1

うん。もしあなたがそれをしなければ、何の結果も得られません。 – sosborn

+0

検索を実行するかどうかにかかわらず、アプリは構成セルでクラッシュします... performFetchのヒントありがとう! ..まだ学習、楽しいが、イライラ。 – roberthuttinger

1

UISearchDisplayControllerを使用していますか?もしあなたが2つのテーブルで終わるなら、あなたの普通のものを表示し、もう1つは検索に関係します。あなたは別々にテーブルを扱わなければなりません。あなたはHow to filter NSFetchedResultsController (CoreData) with UISearchDisplayController/UISearchBarのように

+0

私は何度も読んだが、私はまだどのように@interface BlahViewController() ATproperty(nonatomic、retain)NSFetchedResultsController * fetchedResultsController; ATproperty(非構造、保持)NSFetchedResultsController * searchFetchedResultsController; ATプロパティ(非構造、保持)UISearchDisplayController * mySearchDisplayController; ATend get – roberthuttinger

+0

が実装され、それらが合成され、ゲッターがリンクの答えに記載されます。 –