سؤال

ما هو أفضل الممارسات لتصفية البيانات NSFetchedResultsController؟ هل أنا بحاجة إلى إعادة تهيئة في كل مرة يتغير النص على سيرشبار على ذلك؟

وأنا باستخدام UISearchDisplayControllers وانا المنفذة:

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

وتشك.

هل كانت مفيدة؟

المحلول

وكيف هو رمز الإجابة غي أي تختلف عن السؤال؟ بقدر ما أستطيع أن أخمن، وfilterContentForSearchText: يتم استدعاء أسلوب نطاق بالطرق shouldReload

وعلى أي حال، وهنا بعض التعليمات البرمجية مشابه أضفت في العينة CoreDataBooks لتشمل البحث. إضافة وحدة تحكم بحث العرض في IB للمثال CoreDataBooks. ثم أضفت الرمز إلى RootViewController.m كما يلي:

- (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;
}

وPS. للإجابة على فيفاس، وذلك باستخدام UISearchDisplayController أنه يخلق عرض جدول جديد تلقائيا للعودة للقائمة تمت تصفيتها. يمكنك التحقق من التي تستخدم tableView كما هو مبين في المستندات، ولكن في أبسط الإعداد هو فقط يعمل لأن fetchedResultsController إما تظهر نسخة تمت تصفيتها في عرض جدول البحث أو تظهر كافة البيانات في عرض الجدول الخاص بك.

نصائح أخرى

وأبيرانتلي هذا هو أفضل وسيلة:

- (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];

 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top