কীভাবে ইউআইএসইডডিসপ্লে কনট্রোলার / ইউআইসোচবারের সাথে এনএসফ্যাচডরেসাল্টস কন্ট্রোলার (কোরডাটা) ফিল্টার করবেন


146

আমি আমার কোরডেটা ভিত্তিক আইফোন অ্যাপে অনুসন্ধান কোডটি প্রয়োগ করার চেষ্টা করছি। কীভাবে এগিয়ে যাব আমি নিশ্চিত নই। অ্যাপ্লিকেশনটিতে ইতিমধ্যে একটি এনএসফ্যাচড্রেসাল্টস কন্ট্রোলার রয়েছে প্রাথমিক টেবিলভিউয়ের জন্য ডেটা পুনরুদ্ধার করার জন্য একটি শিকারী। আমি অতিরিক্ত কোড পরিবর্তন করার আগে আমি নিশ্চিত করতে চাই যে আমি সঠিক পথে আছি। আমি বিভ্রান্ত কারণ অনেক উদাহরণ কোরেডাটার পরিবর্তে অ্যারে-ভিত্তিক।

এখানে কিছু প্রশ্ন রয়েছে:

  1. আমার কাছে কি এমন দ্বিতীয় এনএসফ্যাচড্রেসাল্টস কন্ট্রোলার থাকা দরকার যা কেবলমাত্র মিলে যাওয়া আইটেমগুলি পুনরুদ্ধার করে বা আমি প্রাথমিক টেবিলভিউয়ের মতো একই ব্যবহার করতে পারি?

  2. যদি আমি একই ব্যবহার করি তবে এটি কি এফআরসি ক্যাশে সাফ করার মতো সহজ এবং তারপরে হ্যান্ডেলসন্ধান ফরটার্ম: সার্চস্ট্রিং পদ্ধতিতে প্রিকেট পরিবর্তন করার মতো? শিকারীটিকে কী কী প্রাথমিক শিখর পাশাপাশি অনুসন্ধান শর্তাদি থাকতে হবে বা মনে আছে যে এটি প্রথম স্থানে ডেটা পুনরুদ্ধার করতে একটি শিকারী ব্যবহার করেছিল?

  3. আমি কীভাবে মূল ফলাফলগুলিতে ফিরে যেতে পারি? আমি কি কেবল অনুসন্ধানের শৃঙ্খলাটিকে শূন্য করতে পারি? এফআরসি ফলাফলগুলি প্রথম স্থানে পুনরুদ্ধার করতে ব্যবহৃত মূল শিকারীকে হত্যা করবে না?

কারও কাছে যদি এফআরসি দিয়ে সন্ধান করে কোডের কোনও উদাহরণ থাকে তবে আমি এটির প্রশংসা করব!


@ ব্রেন্ট, নিখুঁত সমাধান, আমার জন্য একটি ট্রিট কাজ করেছে!
ডিটারেট্রেট

উত্তর:


193

আমি আসলে আমার প্রকল্পগুলির একটিতে এটি বাস্তবায়ন করেছি (আপনার প্রশ্ন এবং অন্যান্য ভুল উত্তর কী করার ইঙ্গিত দিয়েছিল)। আমি সার্জিওর উত্তরটি চেষ্টা করেছিলাম কিন্তু আসলে কোনও ডিভাইসে চলাকালীন ব্যতিক্রম সংক্রান্ত সমস্যাগুলি ছিল।

হ্যাঁ আপনি দুটি আনয়ন ফলাফল নিয়ামক তৈরি করেছেন: একটি সাধারণ প্রদর্শনের জন্য এবং অন্যটি ইউআইএসবারবারের টেবিল দৃশ্যের জন্য।

আপনি যদি কেবল একটি এফআরসি (এনএসফ্যাচড্রয়েসাল্টস কন্ট্রোলার) ব্যবহার করেন তবে মূল ইউআইটিবেল ভিউ (অনুসন্ধানের সময় সক্রিয় থাকা সারণী প্রদর্শন নয়) সম্ভবত আপনি যখন অনুসন্ধান করছেন তখন কলব্যাক ডাকবে এবং আপনার এফআরসি-র ফিল্টারকৃত সংস্করণটি ভুলভাবে ব্যবহার করার চেষ্টা করবে এবং আপনি ব্যতিক্রমগুলি দেখতে পাবেন বিভাগে বিভাগ বা সারিগুলির ভুল সংখ্যা সম্পর্কে নিক্ষিপ্ত।

আমি যা করেছি তা এখানে: আমার কাছে দুটি এফআরসি পাওয়া যায় হিসাবে ফিচারযুক্ত রেসাল্টস কন্ট্রোলার এবং অনুসন্ধানের জন্য অনুসন্ধানের জন্য ফলাফল দুটি রয়েছে ont অনুসন্ধান না থাকলে অনুসন্ধান ফ্যাচডরেডসাল্টস কন্ট্রোলার ব্যবহার করা উচিত নয় (যখন অনুসন্ধান বাতিল হয়ে যায় আপনি নীচে দেখতে পাবেন যে এই অবজেক্টটি প্রকাশিত হয়েছে)। সমস্ত ইউআইটিএলভিউ পদ্ধতিতে কোন টেবিলের ভিউটি কোয়েরি করবে এবং কোনটি এফআরসি থেকে তথ্যটি টানতে পারে তা নির্ধারণ করতে হবে। এফআরসি প্রতিনিধি পদ্ধতিতে কোন টেবিল ভিউ আপডেট করতে হবে তাও বের করতে হবে।

এটি কতটা বয়লারপ্লেট কোড তা অবাক করে।

শিরোলেখ ফাইলের প্রাসঙ্গিক বিট:

@interface BlahViewController : UITableViewController <UISearchBarDelegate, NSFetchedResultsControllerDelegate, UISearchDisplayDelegate> 
{
    // other class ivars

    // required ivars for this example
    NSFetchedResultsController *fetchedResultsController_;
    NSFetchedResultsController *searchFetchedResultsController_;
    NSManagedObjectContext *managedObjectContext_;

    // The saved state of the search UI if a memory warning removed the view.
    NSString        *savedSearchTerm_;
    NSInteger       savedScopeButtonIndex_;
    BOOL            searchWasActive_;
}
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSFetchedResultsController *fetchedResultsController;

@property (nonatomic, copy) NSString *savedSearchTerm;
@property (nonatomic) NSInteger savedScopeButtonIndex;
@property (nonatomic) BOOL searchWasActive;

প্রয়োগকারী ফাইলের সম্পর্কিত বিট:

@interface BlahViewController ()
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *searchFetchedResultsController;
@property (nonatomic, retain) UISearchDisplayController *mySearchDisplayController;
@end

UITableViewDelegate / ডেটাসোর্স সমস্ত পদ্ধতির সাথে কাজ করার সময় আমি সঠিক এফআরসি পুনরুদ্ধার করার জন্য একটি সহায়ক পদ্ধতি তৈরি করেছি:

- (NSFetchedResultsController *)fetchedResultsControllerForTableView:(UITableView *)tableView
{
    return tableView == self.tableView ? self.fetchedResultsController : self.searchFetchedResultsController;
}

- (void)fetchedResultsController:(NSFetchedResultsController *)fetchedResultsController configureCell:(UITableViewCell *)theCell atIndexPath:(NSIndexPath *)theIndexPath
{
    // your cell guts here
}

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)theIndexPath
{
    CallTableCell *cell = (CallTableCell *)[theTableView dequeueReusableCellWithIdentifier:@"CallTableCell"];
    if (cell == nil) 
    {
        cell = [[[CallTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CallTableCell"] autorelease];
    }

    [self fetchedResultsController:[self fetchedResultsControllerForTableView:theTableView] configureCell:cell atIndexPath:theIndexPath];
    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    NSInteger count = [[[self fetchedResultsControllerForTableView:tableView] sections] count];

    return count;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    NSInteger numberOfRows = 0;
    NSFetchedResultsController *fetchController = [self fetchedResultsControllerForTableView:tableView];
    NSArray *sections = fetchController.sections;
    if(sections.count > 0) 
    {
        id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
        numberOfRows = [sectionInfo numberOfObjects];
    }

    return numberOfRows;

}

অনুসন্ধান বারের জন্য ডেলিগেট পদ্ধতি:

#pragma mark -
#pragma mark Content Filtering
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSInteger)scope
{
    // update the filter, in this case just blow away the FRC and let lazy evaluation create another with the relevant search info
    self.searchFetchedResultsController.delegate = nil;
    self.searchFetchedResultsController = nil;
    // if you care about the scope save off the index to be used by the serchFetchedResultsController
    //self.savedScopeButtonIndex = scope;
}


#pragma mark -
#pragma mark Search Bar 
- (void)searchDisplayController:(UISearchDisplayController *)controller willUnloadSearchResultsTableView:(UITableView *)tableView;
{
    // search is done so get rid of the search FRC and reclaim memory
    self.searchFetchedResultsController.delegate = nil;
    self.searchFetchedResultsController = nil;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString 
                               scope:[self.searchDisplayController.searchBar selectedScopeButtonIndex]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] 
                               scope:[self.searchDisplayController.searchBar selectedScopeButtonIndex]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

এফআরসি প্রতিনিধি পদ্ধতিগুলি থেকে আপডেট পাওয়ার সময় আপনি সঠিক সারণী দর্শনটি ব্যবহার করেছেন তা নিশ্চিত করুন:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{
    UITableView *tableView = controller == self.fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView;
    [tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller 
  didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex 
     forChangeType:(NSFetchedResultsChangeType)type 
{
    UITableView *tableView = controller == self.fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView;

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

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


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

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

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

        case NSFetchedResultsChangeUpdate:
            [self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
            break;

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


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{
    UITableView *tableView = controller == self.fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView;
    [tableView endUpdates];
}

অন্যান্য দেখার তথ্য:

- (void)loadView 
{   
    [super loadView];
    UISearchBar *searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 44.0)] autorelease];
    searchBar.autoresizingMask = (UIViewAutoresizingFlexibleWidth);
    searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
    self.tableView.tableHeaderView = searchBar;

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

- (void)didReceiveMemoryWarning
{
    self.searchWasActive = [self.searchDisplayController isActive];
    self.savedSearchTerm = [self.searchDisplayController.searchBar text];
    self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex];

    fetchedResultsController_.delegate = nil;
    [fetchedResultsController_ release];
    fetchedResultsController_ = nil;
    searchFetchedResultsController_.delegate = nil;
    [searchFetchedResultsController_ release];
    searchFetchedResultsController_ = nil;

    [super didReceiveMemoryWarning];
}

- (void)viewDidDisappear:(BOOL)animated
{
    // save the state of the search UI so that it can be restored if the view is re-created
    self.searchWasActive = [self.searchDisplayController isActive];
    self.savedSearchTerm = [self.searchDisplayController.searchBar text];
    self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex];
}

- (void)viewDidLoad
{
    // restore search settings if they were saved in didReceiveMemoryWarning.
    if (self.savedSearchTerm)
    {
        [self.searchDisplayController setActive:self.searchWasActive];
        [self.searchDisplayController.searchBar setSelectedScopeButtonIndex:self.savedScopeButtonIndex];
        [self.searchDisplayController.searchBar setText:savedSearchTerm];

        self.savedSearchTerm = nil;
    }
}

এফআরসি তৈরির কোড:

- (NSFetchedResultsController *)newFetchedResultsControllerWithSearch:(NSString *)searchString
{
    NSArray *sortDescriptors = // your sort descriptors here
    NSPredicate *filterPredicate = // your predicate here

    /*
     Set up the fetched results controller.
     */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *callEntity = [MTCall entityInManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:callEntity];

    NSMutableArray *predicateArray = [NSMutableArray array];
    if(searchString.length)
    {
        // your search predicate(s) are added to this array
        [predicateArray addObject:[NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchString]];
        // finally add the filter predicate for this view
        if(filterPredicate)
        {
            filterPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:filterPredicate, [NSCompoundPredicate orPredicateWithSubpredicates:predicateArray], nil]];
        }
        else
        {
            filterPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicateArray];
        }
    }
    [fetchRequest setPredicate:filterPredicate];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                                                managedObjectContext:self.managedObjectContext 
                                                                                                  sectionNameKeyPath:nil 
                                                                                                           cacheName:nil];
    aFetchedResultsController.delegate = self;

    [fetchRequest release];

    NSError *error = nil;
    if (![aFetchedResultsController performFetch:&error]) 
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return aFetchedResultsController;
}    

- (NSFetchedResultsController *)fetchedResultsController 
{
    if (fetchedResultsController_ != nil) 
    {
        return fetchedResultsController_;
    }
    fetchedResultsController_ = [self newFetchedResultsControllerWithSearch:nil];
    return [[fetchedResultsController_ retain] autorelease];
}   

- (NSFetchedResultsController *)searchFetchedResultsController 
{
    if (searchFetchedResultsController_ != nil) 
    {
        return searchFetchedResultsController_;
    }
    searchFetchedResultsController_ = [self newFetchedResultsControllerWithSearch:self.searchDisplayController.searchBar.text];
    return [[searchFetchedResultsController_ retain] autorelease];
}   

3
মনে হচ্ছে সুন্দর কাজ করছে! ধন্যবাদ, ব্রেন্ট! আমি বিশেষত ফেচড্রয়েস্টসকন্ট্রোলারফর্টেবল ভিউ: পদ্ধতিটি পছন্দ করি। এটি খুব সহজ করে তোলে!
jschmidt

2
হাস্যকরভাবে ভাল কোড। Jschmidt যেমন বলেছে, কাস্টম "fetchedResultsControllerForTableView:" পদ্ধতিটি পুরো প্রক্রিয়াটিকে সত্যই সহজ করে দেয়।
ড্যানিয়েল অমিতায়ে

ব্রেন্ট। তুমি আসল পুরুষ. তবে, আপনার জন্য এখানে একটি নতুন চ্যালেঞ্জ। ব্যাকগ্রাউন্ড প্রসেসিং ব্যবহার করে এই কোডটি প্রয়োগ করা হচ্ছে। আমি আমার অ্যাপ্লিকেশনটির অন্যান্য অংশের কিছু ছোটখাটো মাল্টি থ্রেডিং করেছি, তবে এটি শক্ত (কমপক্ষে আমার জন্য)। আমি মনে করি এটি একটি সুন্দর ব্যবহারকারীর অভিজ্ঞতা যুক্ত করবে। চ্যালেঞ্জ গ্রহন করা হল?
jschmidt

3
@ ব্রেন্টপ্রিডি ধন্যবাদ! প্রতিবার অনুসন্ধানের পাঠ্য পরিবর্তিত হওয়ার পরিবর্তে আমি আপনার কোডটি সংশোধন করার অনুরোধটি সংশোধন করার জন্য পুনরুদ্ধার করেছিলাম । searchFetchedResultsControllernil
ma11 শেই 28

2
আপনার মধ্যে cellForRowAtIndexPath, আপনি কি এই এই প্রশ্নের self.tableViewমধ্যে কেউ নির্দেশ করেছেন তার মতো করে ঘরটি পাওয়া উচিত নয় ? আপনি যদি এটি না করেন তবে কাস্টম সেল প্রদর্শিত হবে না।
এমবি

18

কেউ কেউ মন্তব্য করেছেন যে এটি একটি একক দিয়ে করা যেতে পারে NSFetchedResultsController। আমি এটিই করেছি এবং বিশদটি এখানে here এই সমাধানটি ধরে নিয়েছে যে আপনি কেবল সারণীটি ফিল্টার করতে চান এবং অনুসন্ধানের ফলাফলের অন্যান্য সমস্ত দিক (সাজানোর ক্রম, সেল বিন্যাস ইত্যাদি) বজায় রাখতে চান।

প্রথমে আপনার UITableViewControllerসাবক্লাসে দুটি বৈশিষ্ট্য সংজ্ঞায়িত করুন (যথাযথ @ সংশ্লেষযুক্ত এবং ডেলোক সহ, প্রযোজ্য ক্ষেত্রে):

@property (nonatomic, retain) UISearchDisplayController *searchController;
@property (nonatomic, retain) NSString *searchString;

দ্বিতীয়ত, viewDidLoad:আপনার UITableViewControllerসাবক্লাসের পদ্ধতিতে অনুসন্ধান বারটি আরম্ভ করুন :

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0,0,self.tableView.frame.size.width,44)]; 
searchBar.placeholder = @"Search";
searchBar.delegate = self;
self.searchController = [[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self] autorelease];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;   
self.searchController.searchResultsDelegate = self; 
self.tableView.tableHeaderView = self.searchController.searchBar;
[searchBar release];

তৃতীয়ত, UISearchDisplayControllerপ্রতিনিধি পদ্ধতিগুলি এভাবে প্রয়োগ করুন :

// This gets called when you start typing text into the search bar
-(BOOL)searchDisplayController:(UISearchDisplayController *)_controller shouldReloadTableForSearchString:(NSString *)_searchString {
   self.searchString = _searchString;
   self.fetchedResultsController = nil;
   return YES;
}

// This gets called when you cancel or close the search bar
-(void)searchDisplayController:(UISearchDisplayController *)controller willUnloadSearchResultsTableView:(UITableView *)tableView {
   self.searchString = nil;
   self.fetchedResultsController = nil;
   [self.tableView reloadData];
}

পরিশেষে, fetchedResultsControllerপদ্ধতিতে NSPredicateযদি self.searchStringসংজ্ঞায়িত হয় তবে তার উপর নির্ভর করে পরিবর্তন করুন :

-(NSFetchedResultsController *)fetchedResultsController {
   if (fetchedResultsController == nil) {

       // removed for brevity

      NSPredicate *predicate;

      if (self.searchString) {
         // predicate that uses searchString (used by UISearchDisplayController)
         // e.g., [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", self.searchString];
          predicate = ... 
      } else {
         predicate = ... // predicate without searchString (used by UITableViewController)
      }

      // removed for brevity

   }

   return fetchedResultsController;
} 

1
এই সমাধানটি আমার পক্ষে ভাল কাজ করেছে এবং এটি অনেক সহজ। ধন্যবাদ! আমি কেবল 'if (self.searchString)' থেকে 'if (self.searchString.length) টুইট করার পরামর্শ দিই। এটি কোনও অনুসন্ধান শুরু করার পরে এবং অনুসন্ধান বার থেকে স্ট্রিংটি মোছার পরে যদি আপনি টেবিল ভিউতে ক্লিক করেন তবে এটি ক্রাশ হওয়া থেকে রোধ করে।
গুটো আরাউজো

17

এই কাজটি করার জন্য আমাকে কয়েকবার চেষ্টা করেছে ...

আমার বোঝার মূল কীটি বুঝতে পেরেছিল যে এখানে কর্মক্ষেত্রে দুটি টেবিল ভিউ রয়েছে। একজন আমার ভিউকন্ট্রোলার দ্বারা পরিচালিত এবং একজন অনুসন্ধান ভিউ কন্ট্রোলার দ্বারা পরিচালিত এবং তারপরে আমি পরীক্ষা করতে পারতাম কোনটি সক্রিয় এবং সঠিক কাজটি করে তা দেখতে। ডকুমেন্টেশনটিও সহায়ক ছিল:

http://developer.apple.com/library/ios/#documentation/uikit/reference/UISearchDisplayController_Class/Reference/Reference.html

আমি যা করেছি তা এখানে -

অনুসন্ধানের তাত্ক্ষণিক পতাকা যুক্ত করা হয়েছে:

@interface ItemTableViewController : UITableViewController <NSFetchedResultsControllerDelegate, UISearchDisplayDelegate, UISearchBarDelegate> {

    NSString *sectionNameKeyPath;
    NSArray *sortDescriptors;


@private
    NSFetchedResultsController *fetchedResultsController_;
    NSManagedObjectContext *managedObjectContext_;

    BOOL searchIsActive;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSString *sectionNameKeyPath;
@property (nonatomic, retain) NSArray *sortDescriptors;
@property (nonatomic) BOOL searchIsActive;

বাস্তবায়ন ফাইলে সংশ্লেষ যুক্ত করা হয়েছে।

তারপরে আমি অনুসন্ধানের জন্য এই পদ্ধতিগুলি যুক্ত করেছি:

#pragma mark -
#pragma mark Content Filtering

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSFetchRequest *aRequest = [[self fetchedResultsController] fetchRequest];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchText];

    [aRequest setPredicate:predicate];

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

}

#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:nil];

    return YES;
}

/*
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    return YES;
}
*/

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    [self setSearchIsActive:YES];
    return;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller 
{
    NSFetchRequest *aRequest = [[self fetchedResultsController] fetchRequest];

    [aRequest setPredicate:nil];

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

    [self setSearchIsActive:NO];
    return;
}

তারপরে কন্ট্রোলার উইল চেঞ্জ কনটেন্টে:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{
    if ([self searchIsActive]) {
        [[[self searchDisplayController] searchResultsTableView] beginUpdates];
    }
    else  {
        [self.tableView beginUpdates];
    }
}

এবং কন্ট্রোলারডড চেঞ্জ কনটেন্ট:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{
    if ([self searchIsActive]) {
        [[[self searchDisplayController] searchResultsTableView] endUpdates];
    }
    else  {
        [self.tableView endUpdates];
    }
}

এবং প্রিকেটটি পুনরায় সেট করার সময় ক্যাশে মুছুন।

আশাকরি এটা সাহায্য করবে.


তবুও আমি বুঝতে পারি না, উপরের উদাহরণটি খুব ভাল, তবে অসম্পূর্ণ, তবে আপনার সুপারিশটি কাজ করা উচিত, তবে তা কার্যকর হয় না ...
ভ্লাদিমির স্টাজিলভ

আপনি কোনও BOOL ব্যবহারের পরিবর্তে সক্রিয় টেবিল ভিউ পরীক্ষা করতে পারেন:if ( [self.tableView isEqual:self.searchDisplayController.searchResultsTableView] ) { ... }
rwyland

@ আরওয়াইল্যান্ড - আমার পরীক্ষাটি দেখায় যে সেল্ফ.ট্যাবলিয় ভিউ যখন সক্রিয় থাকে তখন সার্চডিসপ্লে কন্ট্রোলআর.সারচেচারসাল্টসট্যভিউতে সেট করা হয় না। এগুলি কখনই সমান হবে না।
গিফ

5

আমি একই কাজটির মুখোমুখি হয়েছি এবং এটি সমাধান করার সহজ উপায় পজিবল পেয়েছি । সংক্ষিপ্তভাবে: আপনার আরও একটি পদ্ধতি সংজ্ঞায়িত করা দরকার, -fetchedResultsControllerকাস্টম যৌগের প্রাক্কলকের সাথে সাদৃশ্য।

আমার ব্যক্তিগত ক্ষেত্রে আমার -fetchedResultsControllerচেহারাটি এরকম:

- (NSFetchedResultsController *) fetchedResultsController
{
    if (fetchedResultsController != nil)
    {
        return fetchedResultsController;
    }
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client"
                                              inManagedObjectContext:[[PTDataManager sharedManager] managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"agency_server_id == %@", agency.server_id];
    fetchRequest.predicate = predicate;

    NSSortDescriptor *sortByName1Descriptor = [[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES];
    NSSortDescriptor *sortByName2Descriptor = [[NSSortDescriptor alloc] initWithKey:@"firstname" ascending:YES];
    NSSortDescriptor *sortByName3Descriptor = [[NSSortDescriptor alloc] initWithKey:@"middlename" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortByName1Descriptor, sortByName2Descriptor, sortByName3Descriptor, nil];

    fetchRequest.sortDescriptors = sortDescriptors;

    fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:[[PTDataManager sharedManager] managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
    fetchedResultsController.delegate = self;
    return fetchedResultsController;
}

আপনি দেখতে পাচ্ছেন যে আমি একটি এজেন্সির ক্লায়েন্ট agency.server_idআনছি, প্রিডিকেটে ফিল্টার করা । ফলস্বরূপ আমি একটিতেও আমার লিখিত সামগ্রী পুনরুদ্ধার করছি tableView( কোড প্রয়োগের সাথে সম্পর্কিত tableViewএবং fetchedResultsControllerকোডটি বেশ মানসম্পন্ন)। বাস্তবায়নের জন্য searchFieldআমি একটি UISearchBarDelegateপ্রতিনিধি পদ্ধতি নির্ধারণ করছি । আমি এটি অনুসন্ধান পদ্ধতি দিয়ে ট্রিগার করছি, বলুন -reloadTableView:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self reloadTableView];
}

এবং অবশ্যই এর সংজ্ঞা -reloadTableView:

- (void)reloadTableView
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client"
                                              inManagedObjectContext:[[PTDataManager sharedManager] managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortByName1Descriptor = [[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES];
    NSSortDescriptor *sortByName2Descriptor = [[NSSortDescriptor alloc] initWithKey:@"firstname" ascending:YES];
    NSSortDescriptor *sortByName3Descriptor = [[NSSortDescriptor alloc] initWithKey:@"middlename" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortByName1Descriptor, sortByName2Descriptor, sortByName3Descriptor, nil];
    fetchRequest.sortDescriptors = sortDescriptors;

    NSPredicate *idPredicate = [NSPredicate predicateWithFormat:@"agency_server_id CONTAINS[cd] %@", agency.server_id];
    NSString *searchString = self.searchBar.text;
    if (searchString.length > 0)
    {
        NSPredicate *firstNamePredicate = [NSPredicate predicateWithFormat:@"firstname CONTAINS[cd] %@", searchString];
        NSPredicate *lastNamePredicate = [NSPredicate predicateWithFormat:@"lastname CONTAINS[cd] %@", searchString];
        NSPredicate *middleNamePredicate = [NSPredicate predicateWithFormat:@"middlename CONTAINS[cd] %@", searchString];
        NSPredicate *orPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:firstNamePredicate, lastNamePredicate, middleNamePredicate, nil]];
        NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:idPredicate, nil]];
        NSPredicate *finalPred = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:orPredicate, andPredicate, nil]];
        [fetchRequest setPredicate:finalPred];
    }
    else
    {
        [fetchRequest setPredicate:idPredicate];
    }

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:[[PTDataManager sharedManager] managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController.delegate = self;

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

    [self.clientsTableView reloadData];
}

কোডের এই গুচ্ছটি প্রথমটির সাথে খুব সমান, "মানক" তবে -fetchedResultsController BUT- র ভিতরে থাকলে অন্য বিবৃতিটি এখানে:

+andPredicateWithSubpredicates: - এই পদ্ধতিটি ব্যবহার করে আমরা আমাদের প্রধান প্রথম প্রাপ্তির ফলাফলগুলি সংরক্ষণ করতে একটি প্রিকিকেট সেট করতে পারি tableView

+orPredicateWithSubpredicates - এই পদ্ধতিটি ব্যবহার করে আমরা অনুসন্ধান অনুসন্ধানের মাধ্যমে বিদ্যমান আনয়ন ফিল্টার করছি searchBar

শেষে আমি এই নির্দিষ্ট আনার জন্য যৌগিক প্রিকিকেট হিসাবে পূর্বাভাসের অ্যারে সেট করছি। এবং প্রয়োজনীয় পূর্বাভাসের জন্য, বা forচ্ছিক জন্য।

এবং যে সব! আপনার আর কিছু বাস্তবায়নের দরকার নেই। শুভ কোডিং!


5

আপনি একটি লাইভ অনুসন্ধান ব্যবহার করছেন?

আপনি যদি না হন তবে আপনি সম্ভবত পূর্ববর্তী অনুসন্ধানগুলির সাথে একটি অ্যারে (বা একটি এনএসফ্যাচড্রেসাল্টস কন্ট্রোলার) চান, যখন ব্যবহারকারী "অনুসন্ধান" চাপলে আপনি নিজের ফ্যাচড্রিসাল্টকে তার ভবিষ্যদ্বাণী পরিবর্তন করতে বলবেন tell

যেভাবেই হোক না কেন, আপনাকে প্রতিবার আপনার ফেচড্রেষ্টগুলি পুনর্নির্মাণ করতে হবে। আমি কেবলমাত্র একটি এনএসফ্যাচড্রেসাল্টস কন্ট্রোলার ব্যবহার করার পরামর্শ দিচ্ছি, যেহেতু আপনাকে আপনার কোডটি অনেক বেশি নকল করতে হবে এবং আপনি যে জিনিসটি প্রদর্শন করছেন না তাতে আপনার মেমরি নষ্ট করতে হবে না।

কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনার কোনও এনএসএস স্ট্রিং "অনুসন্ধানপ্যারামিটারগুলি" ভেরিয়েবল রয়েছে এবং আপনার ফেচারড রেজাল্টস পদ্ধতিটি প্রয়োজন অনুসারে এটি আপনার জন্য পুনর্নির্মাণ করে, যদি পাওয়া যায় তবে অনুসন্ধানের প্যারামিটারগুলি ব্যবহার করে, আপনার ঠিক করা উচিত:

ক) "সার্চপ্যারামিটারগুলি" কিছুতে সেট করুন (বা শূন্য নয়, যদি আপনি সমস্ত ফলাফল চান)।

খ) রিলিজ এবং বর্তমান এনএসফ্যাচড্রিজাল্টস কন্ট্রোলার অবজেক্টটি নিল করার জন্য সেট করুন।

গ) সারণী ডেটা পুনরায় লোড করুন।

এখানে একটি সহজ কোড:

- (void)searchString:(NSString*)s {
    self.searchResults = s;
    [fetchedResultsController release];
    fetchedResultsController = nil;
    [self.tableView reloadData];
}

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

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:self.context];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    // searchResults is a NSString*
    if (searchResults != nil) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE %@",searchResults];
        [fetchRequest setPredicate:predicate];
    }

    fetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
        managedObjectContext:self.context sectionNameKeyPath:nil 
        cacheName:nil];
    fetchedResultsController.delegate = self;

    [fetchRequest release];

    return fetchedResultsController;    
}

খুব আকর্ষণীয়! আমি চেষ্টা করে দেব।
jschmidt

এটি কাজ করে বলে মনে হচ্ছে তবে এটি ব্যর্থ হয় যখন আপনার টেবিলটি এফআরসি দ্বারা পপুলেটে যায়, অনুসন্ধান টেবিলভিউটি আপনি ব্যবহার করেন এমন প্রধান সারণী দর্শন থেকে আলাদা টেবিল। অনুসন্ধানের সময় কম মেমরির ডিভাইস থাকা অবস্থায় এবং প্রধান টেবিলভিউ সেলগুলি পুনরায় লোড করতে চায় এফআরসি প্রতিনিধি পদ্ধতিগুলি পুরো জায়গা জুড়ে যায়।
ব্রেন্ট প্রিডি

এর জন্য কি কোনও প্রকল্পের টেমপ্লেটের লিঙ্ক আছে? আমি কোথায় যাচ্ছি তা খুঁজে বের করতে খুব কষ্ট পেয়েছি। একটি রেফারেন্স হিসাবে একটি কাজের টেমপ্লেট রাখা খুব সুন্দর হবে।
রাইম্যাক 3

@ ব্রেন্ট, আপনার যদি এটির অনুসন্ধান টেবিলভিউ যা এফআরসি প্রতিনিধি পদ্ধতিতে পরিবর্তনের প্রয়োজন হয় তা পরীক্ষা করা উচিত - আপনি যদি এফআরসি এবং ইউআইটিএবলভিউ প্রতিনিধিদের পদ্ধতিতে সঠিক টেবিলটি করেন এবং আপডেট করেন তবে মূল টেবিলভিউ এবং উভয় ক্ষেত্রেই এফআরসি ব্যবহার করার সময় সবকিছু ঠিকঠাক করা উচিত সারণী দর্শন।
কার্ভিচ

@ কারভিচ আমি বিশ্বাস করি আপনি আমার উত্তর উপরে বর্ণনা করছেন বা আপনি কি বলছেন যে আপনি কেবল একটি এফআরসি দিয়ে এটি করতে পারবেন?
ব্রেন্ট প্রিডি

5

সুইফট ৩.০, ইউআইএস সার্চ কন্ট্রোলার, এনএসফ্যাচডরেসাল্টস কন্ট্রোলার এবং কোর ডেটা

এই কোডটি সুইফট 3.0 এর সাথে কাজ করবে Core Data! মডেল থেকে ফিল্টারিং এবং অনুসন্ধানের জন্য আপনার একক প্রতিনিধি পদ্ধতি এবং কয়েকটি লাইন কোডের প্রয়োজন হবে। আপনি যদি সমস্ত FRCএবং তার delegateপদ্ধতিগুলি প্রয়োগ করে থাকেন তবে কিছুই প্রয়োজন হবে না searchController

UISearchResultsUpdatingপ্রোটোকল পদ্ধতি

func updateSearchResults(for searchController: UISearchController) {

    let text = searchController.searchBar.text

    if (text?.isEmpty)! {
       // Do something 
    } else {
        self.fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "( someString contains[cd] %@ )", text!)
    }
    do {
        try self.fetchedResultsController.performFetch()
        self.tableView.reloadData()
    } catch {}
}

এটাই! আশা করি এটি আপনাকে সাহায্য করবে! ধন্যবাদ


1

SWIFT 3.0

একটি টেক্সটফিল্ড ব্যবহার করুন, ইউআইএসকারডিসপ্লে কনট্রোলার আইওএস 8 হিসাবে অবহিত করা হয়েছে, আপনাকে একটি ইউআইএসইচকন্ট্রোলার ব্যবহার করতে হবে। অনুসন্ধান কন্ট্রোলারের সাথে ডিল করার পরিবর্তে আপনি নিজের অনুসন্ধান ব্যবস্থাটি তৈরি করবেন না কেন? আপনি এটিকে আরও কাস্টমাইজ করতে পারেন এবং এর উপর আরও নিয়ন্ত্রণ রাখতে পারেন এবং অনুসন্ধানকন্ট্রোলার পরিবর্তন এবং / বা অবমূল্যায়িত হওয়ার বিষয়ে চিন্তা করার দরকার নেই।

এই পদ্ধতিটি আমি ব্যবহার করি খুব ভাল কাজ করে এবং এর জন্য খুব বেশি কোডের প্রয়োজন নেই। এটির জন্য আপনার মূল ডেটা ব্যবহার করা এবং NSFetchedResultsController প্রয়োগ করা দরকার।

প্রথমে একটি টেক্সটফিল্ড তৈরি করুন এবং একটি পদ্ধতিতে এটি নিবন্ধ করুন:

searchTextField?.addTarget(self, action: #selector(textFieldDidChange), for: UIControlEvents.editingChanged)

তারপরে লক্ষ্য সংযোজন করার সময় নির্বাচকটিতে বর্ণিত আপনার পাঠ্যফিল্ডডিড চেঞ্জ পদ্ধতিটি তৈরি করুন:

func textFieldDidChange() {
    if let queryString = searchTextField.text {
        filterList(queryString)
        self.tableView.reloadData()
    }
}

তারপরে আপনি filterList()এনএসপ্রেডিকেট বা এনএসকম্পাউন্ড প্রিডিকেটটি আরও জটিল হলে পদ্ধতিতে তালিকাটি ফিল্টার করতে চান । আমার ফিল্টারলিস্ট পদ্ধতিতে, আমি সত্তার নাম এবং সত্ত্বার নাম "সাবক্যাটরিজ" অবজেক্টের (অনেকের সাথে এক সম্পর্কের) উপর ভিত্তি করে ফিল্টারিং করছি।

func filterList(_ queryString: String) {
    if let currentProjectID = Constants.userDefaults.string(forKey: Constants.CurrentSelectedProjectID) {
        if let currentProject = ProjectDBFacade.getProjectWithID(currentProjectID) {
            if (queryString != ""){
                let categoryPredicate = NSPredicate(format: "name CONTAINS[c] %@ && project == %@", queryString, currentProject)
                let subCategoryPredicate = NSPredicate(format: "subCategories.name CONTAINS[c] %@ && project == %@", queryString, currentProject)
                let orPredicate = NSCompoundPredicate(type: .or, subpredicates: [categoryPredicate, subCategoryPredicate])
                fetchedResultsController.fetchRequest.predicate = orPredicate
            }else{
                fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "project == %@", currentProject)
            }

            do {
                try fetchedResultsController.performFetch()
            } catch {
                print("Error:  Could not fetch fetchedResultsController")
            }
        }
    }
}

0

আমি মনে করি লুকার এটার জন্য আরও ভাল পদ্ধতি রয়েছে। দেখুন LargeDataSetSample এবং তার কারণ

তিনি ব্যবহার করেন না FetchedResultsController , তবে অনুসন্ধানের সময় ক্যাশে ব্যবহার করেন, তাই ব্যবহারকারী অনুসন্ধানবারে আরও বেশি টাইপ করলে অনুসন্ধানের ফলাফলগুলি আরও দ্রুত উপস্থিত হয়

আমি তার অ্যাপ্লিকেশনটিতে তার পদ্ধতির ব্যবহার করেছি এবং এটি ঠিক আছে। এছাড়াও মনে রাখবেন আপনি যদি মডেল অবজেক্টের সাথে কাজ করতে চান, এটি যথাসম্ভব সহজ করুন, সেটপ্রপ্রেটিস টোফ্যাচ সম্পর্কে আমার উত্তর দেখুন


0

একাধিক ডেটা সেট সহ ফলকৃত ফলাফলগুলি হ্যান্ডল করার এখানে একটি উপায় যা প্রায় কোথাও প্রয়োগ করার জন্য সহজ এবং সাধারণ উভয়ই। কিছু শর্ত উপস্থিত থাকলে কেবল আপনার প্রধান ফলাফলগুলিকে অ্যারেতে ধরুন।

NSArray *results = [self.fetchedResultsController fetchedObjects];

আপনার মূল ফ্যাচড রিসাল্টগুলির একটি উপসেট তৈরি করার জন্য এটিতে লুপিং বা যা ইচ্ছা আপনি যা চান তা জিজ্ঞাসা করুন। এবং এখন আপনি কোনও শর্ত উপস্থিত থাকলে সম্পূর্ণ সেট বা উপসেটটি ব্যবহার করতে পারেন।


0

আমি সত্যিই জোশ ও'কনোরকে পছন্দ করেছি যেখানে তিনি একটি ব্যবহার করেন না UISearchController। এই নিয়ামক এখনও (এক্সকোড 9) এর একটি লেআউট বাগ রয়েছে যা অনেকে চেষ্টা করার চেষ্টা করছেন।

আমি একটি UISearchBarপরিবর্তে একটি ব্যবহার করে ফিরে এসেছি UITextFieldএবং এটি বেশ সুন্দরভাবে কাজ করে। অনুসন্ধান / ফিল্টারটির জন্য আমার প্রয়োজনীয়তা একটি উত্পাদন করা NSPredicate। এটি এফআরসিতে পাস করা হয়েছে:

   class ViewController: UIViewController, UITableViewDelegate, 
 UITableViewDataSource, UISearchBarDelegate {

        @IBOutlet var searchBar: UISearchBar!

         func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

                shouldShowSearchResults = true

                if let queryString = searchBar.text {
                    filterList(queryString)

                    fetchData()
                }
            }



          func filterList(_ queryString: String) {
        if (queryString == "") {
            searchPredicate = nil
    }
        else {
            let brandPredicate = NSPredicate(format: "brand CONTAINS[c] %@", queryString)
            let modelPredicate = NSPredicate(format: "model CONTAINS[c] %@", queryString)
            let orPredicate = NSCompoundPredicate(type: .or, subpredicates: [brandPredicate, modelPredicate])
            searchPredicate = orPredicate
    }

}

...

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: filmEntity)
        request.returnsDistinctResults = true
        request.propertiesToFetch = ["brand", "model"]

        request.sortDescriptors = [sortDescriptor]
        request.predicate = searchPredicate

শেষ অবধি, অনুসন্ধান প্রতিনিধিটির সাথে তার প্রতিনিধিটিকে তারে যুক্ত করুন।

আমি এই অন্যদের সাহায্য করে আশা করি


0

কোরেডাটা ব্যবহার করে বিদ্যমান ইউআইটিএবলভিউ ফিল্টার করার সহজ পদ্ধতির এবং আপনি কীভাবে ইতোমধ্যে বাছাই করেছেন।

এটি আমার কাছে আক্ষরিক অর্থে 5 মিনিট সেটআপ এবং কাজ শুরু করার জন্য।

আইক্লাউড থেকে ডেটা দিয়ে জনবহুল UITableViewব্যবহার করে আমার একটি বিদ্যমান উপস্থিত ছিল CoreDataএবং এতে ব্যবহারকারীর ইন্টারঅ্যাকশন বেশ জটিল complicatedUISearchViewController । আমি FetchRequestইতিমধ্যে ইতিমধ্যে ব্যবহৃত ব্যবহৃততে প্রাকটিকেট যুক্ত করতে সক্ষম হয়েছি FetchResultsControllerএবং যা ইতিমধ্যে সাজানো ডেটা ফিল্টার করে।

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSPredicate *filterPredicate;

    if(searchText != nil && searchText.length > 0)
        filterPredicate = [NSPredicate predicateWithFormat:@"(someField CONTAINS[cd] %@) OR (someOtherField CONTAINS[cd] %@)", searchText, searchText];
    else
        filterPredicate = nil;

    _fetchedResultsController.fetchRequest.predicate = filterPredicate;

    NSError *error = nil;
    [_fetchedResultsController performFetch:&error];
    [self.tableView reloadData];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.