Поиск в PFQueryTableView не работает

У меня есть PFQueryTableView с UISearchBar для поиска пользователей из моего пользовательского класса на сервере Parse, но он никогда не работает. Вот мой код:

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

Этот код отображает всех пользователей, если их «featuredNote» выходит — эта часть работает нормально, но когда я ищу, она не показывает результаты поиска. Я ввожу ключевое слово в поле поиска, и когда я нажимаю поиск на клавиатуре, срабатывает метод searchBarSearchButtonClicked, но это все. Я ожидаю, что будет вызван queryForTable, но это не так. В результате в таблице все пользователи по-прежнему отображаются как исходные. Что я сделал не так или я что-то пропустил здесь? Пожалуйста, помогите. Большое спасибо.

Обновить

Поскольку я заменил [self.tableView reloadData]; на [self loadObjects]; и теперь я могу вызывать queryForTable после searchBarSearchButtonClicked. Однако tableView numberOfRowsInSection по-прежнему всегда возвращает ноль.


person SanitLee    schedule 28.03.2015    source источник


Ответы (2)


Вот код вы запросили из проекта с аналогичной потребностью в реализации. В итоге я использовал UISearchBar с отдельным UITableView для отображения результатов. При реализации убедитесь, что правильно подключены раскадровки для UISearchBar и UITableView. Кроме того, delegate в строке поиска должно быть установлено на ViewController, а delegate и dataSource в табличном представлении должно быть установлено на 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

надеюсь, это поможет

person H K    schedule 30.03.2015

Вы задаете запрос, но не указываете ему выполнять поиск, вам нужно сделать что-то вроде этого:

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

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

    //Your code here


}];//this PERFORMS the query
person Kex    schedule 28.03.2015
comment
Вы правы, поэтому я реализовал код для поиска в блоке запроса, как вы предложили, но есть проблема. Когда я нажимаю поиск, появляется сообщение об ошибке 'Для этого запроса имеется незанятое сетевое соединение. Вы должны подождать, пока это не будет сделано». Но спасибо, что указали на это. - person SanitLee; 29.03.2015
comment
почему у вас два запроса? PFQuery *query = [запрос PFUser]; и PFQuery *userQuery = [запрос PFUser]?. userQuery никогда не используется в этом коде. почему это там? - person Kex; 29.03.2015
comment
Вы можете опубликовать больше своего кода? если вы получаете эту ошибку, скорее всего, вы пытаетесь выполнить более одной операции с одним и тем же объектом Parse одновременно. - person Kex; 29.03.2015