Search in PFQueryTableView not working

纵饮孤独 提交于 2019-12-25 05:31:52

问题


I have PFQueryTableView with UISearchBar to search users from my user class on Parse server but I never get it working. Here is my code:

SearchViewController.h

#import <Parse/Parse.h>
@interface PAWUserSearch1ViewController : PFQueryTableViewController
@end

SearchViewController.m

#import "SearchViewController.h"
#import "PAWAppDelegate.h"

@interface SearchViewController () <UIGestureRecognizerDelegate, UISearchBarDelegate, UISearchDisplayDelegate>
@property (strong, nonatomic) IBOutlet UISearchBar *searchBar;
@property (nonatomic, strong) UISearchDisplayController *searchController;
@end

@implementation SearchViewController

- (id)initWithStyle:(UITableViewStyle)style {
    self = [super initWithStyle:style];
    if (self) {
        self.parseClassName = [PFUser parseClassName];
        self.pullToRefreshEnabled = NO;
        self.paginationEnabled = YES;
        self.objectsPerPage = self.objects.count;
    }
    return self;
}

- (PFQuery *)queryForTable {
    NSLog(@"searchbar text --> %@", self.searchBar.text);

    PFQuery *query = [PFUser query];
    if ([self.searchBar.text length]!=0) {
        PFQuery *userQuery = [PFUser query];
        [userQuery whereKey:kPAWParseUsernameKey matchesRegex:self.searchBar.text modifiers:@"i"];
        [query whereKey:kPAWParseUserKey matchesKey:@"objectId" inQuery:userQuery];
    } else {
        [query whereKeyExists:@"featuredNote"]; //show only users with location detailed
    }

    return query;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"number of users --> %i", self.objects.count);
    return self.objects.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *identifier = @"reuseIdentifier";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];

    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:identifier];
    }

    // display user name
    NSString *userNameWithLocation = [NSString stringWithFormat:@"@%@ -%@", [self.objects[indexPath.row] objectForKey:kPAWParseUsernameKey], [self.objects[indexPath.row] objectForKey:@"featuredNote"]];
    cell.textLabel.text = userNameWithLocation;
    cell.textLabel.textColor = [UIColor darkGrayColor];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 70.0;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    //set nav
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonPressed:)];

    self.pullToRefreshEnabled = NO;

    // Hide the search bar until user scrolls up
    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
    self.tableView.tableHeaderView = self.searchBar;
    self.searchBar.delegate = self;

    self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar
                                                          contentsController:self];
    self.searchController.searchResultsDataSource = self;
    self.searchController.searchResultsDelegate = self;
    self.searchController.delegate = self;

    CGPoint offset = CGPointMake(0, self.searchBar.frame.size.height);
    self.tableView.contentOffset = offset;

    self.searchBar.placeholder = NSLocalizedString(@"Username", nil);
}

- (IBAction)doneButtonPressed:(id)sender {
    [self.presentingViewController dismissModalViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    NSLog(@"search pressed!!!!!!");
    [searchBar resignFirstResponder];
    //[self.tableView reloadData];
    [self loadObjects];
}
@end

This code displays all users if their "featuredNote" exits - this part works fine but when I search it does't show search results. I type a keyword in search box and when I hit search on keyboard, the searchBarSearchButtonClicked method is fired but that is it. I expect queryForTable to be called but it is not. As a result, the table still shows all users as original. What have I done wrong or am I missing something here? Please help out. Thank you so much.

Update

Since I have replaced [self.tableView reloadData]; with [self loadObjects]; and I am able to call queryForTable after searchBarSearchButtonClicked. However, tableView numberOfRowsInSection still always returns zero.


回答1:


Here's the code you asked for from a project with a similar implementation need. I ended up using a UISearchBar with a separate UITableView to display the results. Make sure to make the proper Storyboard connections for the UISearchBar and UITableView when implementing. Also, the search bar's delegate should be set to the ViewController and the table view's delegate and dataSource should be set to the ViewController.

static NSString * const kSearchResultsTableCellReuseIdentifier = @"SearchResultsTableCellReuseIdentifier";

@interface ViewController ()
    @property (nonatomic, strong) NSArray *searchResults;
    @property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
    @property (nonatomic, weak) IBOutlet UITableView *searchResultsTable;
@end

@implementation ViewController

...

#pragma mark - Protocol conformance

#pragma mark UISearchBarDelegate methods

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if([searchText length] == 0)
    {
        [self dismissSearch];
    }
    else
    {
        [self handleSearchForString:searchText];
    }
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    // any logic related to Search button being clicked
}

#pragma mark UITableViewDataSource methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.searchResults count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.searchResultsTable dequeueReusableCellWithIdentifier:kSearchResultsTableCellReuseIdentifier];

    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kSearchResultsTableCellReuseIdentifier];
    }

    // Search result text to be displayed in table
    cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row].name;

    return cell;
}

#pragma mark UITableViewDelegate methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // any logic for when a cell in the search results table is selected

    [self dismissSearch];
}    

#pragma mark - Helpers

- (void)handleSearchForString:(NSString *)searchString
{
    // any logic for retrieving search results as an NSArray we'll call `results`

    self.searchResults = results;
    [self.searchResultsTable reloadData];

}

- (void)dismissSearch
{
    self.searchBar.text = @"";

    [self.searchBar performSelector: @selector(resignFirstResponder)
                      withObject: nil
                      afterDelay: 0.1];
}

@end

Hope that helps




回答2:


You are setting the query but you are not telling it to do a search, you need to do something like this :

[query whereKeyExists:@"featuredNote"];//this sets the query

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    //Your code here


}];//this PERFORMS the query


来源:https://stackoverflow.com/questions/29313349/search-in-pfquerytableview-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!