Search code examples
iosobjective-cuitableviewuisearchcontroller

UISearchController touches in safe area when press inside the search bar in Objective-C


I have one tableview and I created one UISearchController programmatically and added to tableview. Initial Search BAR

Initially it looks good but when I press on inside the search bar it looks below.
When I press search bar

I don't want to keep my searchbar in navigation bar. And I can not use UITableViewController.

Find the code below which I implemented.

My .h file

@property (strong, nonatomic) UISearchController *searchController;  
NSMutableArray *tableData;  
NSArray *filteredContentList;

My .m file

// New SearchController.
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.searchBar.delegate = self;
    self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent;

    [self.searchController.searchBar sizeToFit];
    self.tblUserList.tableHeaderView = self.searchController.searchBar;
    self.definesPresentationContext = YES;  

#pragma mark - UISearchDisplayDelegate

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSString *searchString = searchController.searchBar.text;
    NSPredicate *resultPredicate;

    //resultPredicate = [NSPredicate predicateWithFormat:@"displayname contains[c] %@",searchString];
    resultPredicate = [NSPredicate predicateWithFormat:@"value contains[c] %@", searchString];
    filteredContentList = [tableData filteredArrayUsingPredicate:resultPredicate];
    //filteredContentList = [[tableData valueForKey:@"data"] filteredArrayUsingPredicate:resultPredicate];
    [self.tblUserList reloadData];
}
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope {
    [self updateSearchResultsForSearchController:self.searchController];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    CGRect searchBarFrame = self.searchController.searchBar.frame;
    [self.tblUserList scrollRectToVisible:searchBarFrame animated:NO];
    return NSNotFound;
}

I want to show my searchbar above the tableview not in naviationbar.

Thanks in advance.


Solution

  • Late answer by myself.
    I use UITextFiled instead of UISearchBar. Below is my code implementation.

    [self.searchTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
    

    And my textFieldDidChange method

    -(void)textFieldDidChange:(UITextField *)textField
    {
        searchTextString=textField.text;
        [self updateSearchArray:searchTextString];
    }
    
    -(void)updateSearchArray:(NSString *)searchText {
        if(searchText.length==0) {
            isFilter=NO;
        } else {
            isFilter=YES;
            filteredContentList = [[NSMutableArray alloc]init];
            NSPredicate *resultPredicate;
            resultPredicate = [NSPredicate predicateWithFormat:@"value contains[c] %@", searchText];
            filteredContentList = [tableData filteredArrayUsingPredicate:resultPredicate];
            [self.tblUserList reloadData];
    
        }
    }  
    

    And my TableView methods:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        NSInteger numOfSections = 0;
        if ([filteredContentList count] || [tableData count]) {
            _tblUserList.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
            numOfSections                = 1;
            _tblUserList.backgroundView = nil;
        } else {
            UILabel *noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, _tblUserList.bounds.size.width, _tblUserList.bounds.size.height)];
             noDataLabel.text = NSLocalizedString(@"No Users found", @"Message");
             noDataLabel.textColor = [UIColor blackColor];
             noDataLabel.textAlignment = NSTextAlignmentCenter;
             _tblUserList.backgroundView = noDataLabel;
             _tblUserList.separatorStyle = UITableViewCellSeparatorStyleNone;
        }
        return numOfSections;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        /*if (isSearching) {
            return [filteredContentList count];
        }
        else {
            return [tableData count];
        }*/
        if (isFilter) {
            return [filteredContentList count];
        } else {
            return [tableData count];
        }
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *simpleTableIdentifier = @"SimpleTableItem";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }
        //cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKeyPath:@"data.displayname"];
        // Configure the cell...
        if (isFilter) {
            //cell.textLabel.text = [filteredContentList objectAtIndex:indexPath.row];
            cell.textLabel.text = [[filteredContentList objectAtIndex:indexPath.row] valueForKeyPath:@"data.displayname"];
        }
        else {
            cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKeyPath:@"data.displayname"];
        }
        return cell;
    }  
    

    OutPut