2009-09-13 17 views
17

NSFetchedResultsController डेटा फ़िल्टर करने के लिए सबसे अच्छा अभ्यास क्या है? क्या मुझे खोजबार के पाठ में हर बार इसे फिर से शुरू करने की आवश्यकता है?खोज के साथ NSFetchedResultsController

मैं एक UISearchDisplayControllers उपयोग कर रहा हूँ और मैं को लागू कर रहा हूँ:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString; 

Thx।

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    self.savedSearchTerm = searchText; 

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

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

    [self.tableView reloadData]; 

    // [searchBar resignFirstResponder]; 
    // [_shadeView setAlpha:0.0f]; 

} 
+0

आपने तालिका दृश्य डेटा स्रोत विधियों को संभालने का अंत कैसे किया ताकि तालिका दृश्य को पता चले कि 'फ़िल्टर की गई सूची' को प्रदर्शित करना है या नहीं? – CraigH

+1

यहां उत्तर बहुत उपयोगी है http://stackoverflow.com/questions/4471289/how-to-filter-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontroll/4481896#4481896 – acecapades

+0

यहां मैंने जो किया है: http: // stackoverflow .com/प्रश्न/4471289/कैसे-से-फ़िल्टर-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontrolle/4856118 # 4856118 –

उत्तर

17

कैसे लड़का के जवाब कोड सवाल से किसी भी अलग है:

+0

अभी भी अजीब व्यवहार ... वस्तुओं को फ़िल्टर किया जाता है, लेकिन जब मैं तालिका दृश्य को स्क्रॉल करता हूं तो यह एक अपवाद देता है, क्योंकि fetchController के पास विशेष अनुक्रमणिका पर ऑब्जेक्ट नहीं होता है ... क्या गलत हो सकता है? कृपया, –

+0

में मेरी समस्या का पता लगाया गया ... जब मुझे फ़िल्टर किए गए परिणाम मिलते हैं तो वे तालिका में प्रदर्शित होते हैं उसी तरह कॉन्फ़िगर किया गया है और जब मैं पंक्ति संख्या एक्स पर स्क्रॉल करता हूं जहां पंक्तियों की वास्तविक संख्या एक्स से छोटी होती है ... क्या क्या मुझे करना चाहिए.. –

8

appearantly इस एक बेहतर तरीका है? जहां तक ​​मैं अनुमान लगा सकता हूं, filterContentForSearchText: स्कोप विधि को चाहिएरलोड मोड द्वारा बुलाया जाता है?

वैसे भी, यहां कुछ समान कोड है जो मैंने CoreDataBooks नमूना में खोज को शामिल करने के लिए जोड़ा है। CoreDataBooks उदाहरण के लिए आईबी में एक खोज प्रदर्शन नियंत्रक जोड़ें। फिर मैंने रूटव्यू कंट्रोलर.एम में कोड जोड़ा:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
NSInteger searchOption = controller.searchBar.selectedScopeButtonIndex; 
return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption]; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { 
NSString* searchString = controller.searchBar.text; 
return [self searchDisplayController:controller shouldReloadTableForSearchString:searchString searchScope:searchOption]; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString*)searchString searchScope:(NSInteger)searchOption { 

NSPredicate *predicate = nil; 
if ([searchString length]) 
    if (searchOption == 0) // full text, in my implementation. Other scope button titles are "Author", "Title" 
    predicate = [NSPredicate predicateWithFormat:@"title contains[cd] %@ OR author contains[cd] %@", searchString, searchString]; 
    else 
    // docs say keys are case insensitive, but apparently not so. 
    predicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", [[controller.searchBar.scopeButtonTitles objectAtIndex:searchOption] lowercaseString], searchString]; 
[fetchedResultsController.fetchRequest setPredicate:predicate]; 

    NSError *error = nil; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
    }   

return YES; 
} 

पीएस। विवा का उत्तर देने के लिए, UISearchDisplayController का उपयोग करके यह फ़िल्टर की गई सूची को ओवरले करने के लिए स्वचालित रूप से एक नई तालिका दृश्य बनाता है। दस्तावेज़ों में दिखाए गए अनुसार आप कौन सी तालिका दृश्य का उपयोग कर रहे हैं, यह जांच सकते हैं, लेकिन सबसे सरल सेटअप में यह केवल काम करता है क्योंकि fetchedResultsController या तो खोज के तालिका दृश्य में फ़िल्टर किए गए संस्करण को दिखा रहा है या आपके तालिका दृश्य में सभी डेटा दिखा रहा है।

+29

निकास (-1) थोड़ा कठोर है। – 0xced

+5

सेब दस्तावेज़ कहते हैं कि fetch अनुरोध को बदला नहीं जाना चाहिए - वे विशेष रूप से कहते हैं कि आपको भविष्यवाणी नहीं बदलनी चाहिए। –

+1

@RogerNolan क्या आप निश्चित हैं? जांचें [NSFetchedResultsController क्लास संदर्भ: प्राप्त करने के अनुरोध को संशोधित करना] (http://j.mp/z3W7QK)। वे तीन कदम मेरे लिए ठीक काम करते हैं, और मैं भी fetch अनुरोध की भविष्यवाणी को संशोधित करता हूं। – ma11hew28

संबंधित मुद्दे