问题
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