Home > Blockchain >  UITableView not reloading data when SearchBar is Canceled
UITableView not reloading data when SearchBar is Canceled

Time:02-26

I have a SearchBar on my tableView. It is correctly working when typing to search through the table view. However, when the cancel button is pressed, the tableView is not reloading the data.

-(void)viewDidLoad {
    [super viewDidLoad];
    isFiltered = false;
    self.searchController = [[UISearchController alloc]
     initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
  
    self.searchController.searchBar.delegate = self;
    self.tableView.tableHeaderView = self.searchController.searchBar;
    self.definesPresentationContext = YES;
    [self.searchController.searchBar sizeToFit];
}
- (void)viewWillAppear:(BOOL)animated {
    
    NSBundle *bundle = [NSBundle mainBundle];
    
    self.files  = [bundle pathsForResourcesOfType:@"pdf" inDirectory:@"thepdfpowerpoints"];
    NSString *documentsDirectoryPath = [self.files objectAtIndex:thepath.row];
    self.title = @"Devo Songs";
    self.filenames = [[documentsDirectoryPath lastPathComponent] stringByDeletingPathExtension];
    
    
    NSMutableArray *names = [NSMutableArray arrayWithCapacity:[self.files count]];
    for (NSString *path in self.files) {
        [names addObject:[[path lastPathComponent] stringByDeletingPathExtension]];
    }
    //self.files = names;
    self.files = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    NSLog(@"FILESLOAD%@", self.files);

     self.tableView.delegate = self;
       self.tableView.dataSource = self;
      }
-(void) updateSearchResultsForSearchController:(UISearchController *)searchController {
    isFiltered = true;
    NSString *searchText = self.searchController.searchBar.text;

           searchResults = [[NSMutableArray alloc] init];
           
           for (NSString *file in self.files) {
               NSRange nameRange = [file rangeOfString:searchText options:NSCaseInsensitiveSearch];
               if (nameRange.location != NSNotFound) {
                   [searchResults addObject:file];
               }
           }
    [self.tableView reloadData];
}
-(void) searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    //self.tableView.tableHeaderView = searchBar;
   NSLog(@"Cancel");
   isFiltered=false;
    [self.tableView reloadData];
    
}

I have added an NSLog in cellForRowAtIndexPath This is showing in console when I first go to the view, but it is not being called when I click the cancel button.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        NSLog(@"Loading");

The code for number of rows/section is:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    if (isFiltered) {
        return [searchResults count];
        
    }
    else {
        return [self.files count];
    }
    
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    
    return 1;
    
    
}

CodePudding user response:

Tapping the search bar's "Cancel" button clears the search text...

and then calls updateSearchResultsForSearchController.

So your current code is setting isFiltered to true again, and then reloading the table view based on an empty searchResults array.

You don't really need to implement searchBarCancelButtonClicked unless you want to do something other than refresh your table view.

Try changing your updateSearchResultsForSearchController method to this - it will use the full files array if no text has been entered in the search field. Otherwise, it will filter the files array.

-(void) updateSearchResultsForSearchController:(UISearchController *)searchController {

    NSLog(@"update"); // just to show when this is being called

    NSString *searchText = self.searchController.searchBar.text;

    if (searchText.length != 0) {
        isFiltered = YES;
        
        searchResults = [[NSMutableArray alloc] init];
        
        for (NSString *file in self.files) {
            NSRange nameRange = [file rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (nameRange.location != NSNotFound) {
                [searchResults addObject:file];
            }
        }
    } else {
        isFiltered = NO;
    }
    
    [self.tableView reloadData];
}
  • Related