Question

Im trying to use a UISearch bar to be able to find all the objects by a specific person. I have it set up so that each PFUser or user has a name object within the main object of points. When I attempt to find the user and there objects nothing appears, but in the NSLogs I get all of the information. I think my issue is in the cellForRowAtIndexPath, But I don't know why!

First I query:

- (PFQuery *)queryForTable {
    PFQuery *query = [PFQuery queryWithClassName:@"points"];


    // The key of the PFObject to display in the label of the default cell style
    //self.textKey = @"opponent";

    // Uncomment the following line to specify the key of a PFFile on the PFObject to display in the imageView of the default cell style
    // self.imageKey = @"image";

    // Whether the built-in pull-to-refresh is enabled
    self.pullToRefreshEnabled = YES;

    // Whether the built-in pagination is enabled
    self.paginationEnabled = NO;

    // The number of objects to show per page
    self.objectsPerPage = 50;
  //where you set the username to the specific user to get only this user's post.
    // If no objects are loaded in memory, we look to the cache first to fill the table
    // and then subsequently do a query against the network.

    if (self.objects.count == 0) {
        query.cachePolicy = kPFCachePolicyCacheThenNetwork;
    }

    [query orderByDescending:@"createdAt"];

    return query;
}

I place my bar:

-(void)viewDidAppear:(BOOL)animated{
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];

self.tableView.tableHeaderView = self.searchBar;

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.searchResults = [NSMutableArray array];
}

Filtering the results:

    -(void)filterResults:(NSString *)searchTerm {

        [self.searchResults removeAllObjects];

        PFQuery *query = [PFQuery queryWithClassName: @"points"];
        [query whereKeyExists:@"name"];  //this is based on whatever query you are trying to accomplish
        [query whereKeyExists:@"opponent"]; //this is based on whatever query you are trying to accomplish
        [query whereKey:@"name" containsString:searchTerm];

        NSArray *results  = [query findObjects];

        NSLog(@"%@", results);
        NSLog(@"%u", results.count);

        [self.searchResults addObjectsFromArray:results];
    }

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [self filterResults:searchString];
    return YES;
}
Counting The Objects:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if (tableView == self.tableView) {
        //if (tableView == self.searchDisplayController.searchResultsTableView) {

        return self.objects.count;

    } else {

        return self.searchResults.count;

    }

}

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

Trying to show it all!:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
    // If you want a custom cell, create a new subclass of PFTableViewCell, set the cell identifier in IB, then change this string to match
    // You can access any IBOutlets declared in the .h file from here and set the values accordingly
    // "Cell" is the default cell identifier in a new Master-Detail Project
    static NSString *CellIdentifier = @"celltag";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    if (tableView != self.searchDisplayController.searchResultsTableView) {
        UILabel *game = (UILabel*) [cell viewWithTag:200];
        game.text = [NSString stringWithFormat:@"V.s %@", [object objectForKey:@"opponent"]];

        UILabel *points = (UILabel*) [cell viewWithTag:201];
        points.text = [NSString stringWithFormat:@"Points: %@G, %@A, %@Pts, %@, %@Hits, %@PPG",[object objectForKey:@"goals"], [object objectForKey:@"assists"], [object objectForKey:@"totalpoints"], [object objectForKey:@"plusminus"], [object objectForKey:@"hits"],[object objectForKey:@"ppg"]];

        UILabel *date = (UILabel*) [cell viewWithTag:250];
        date.text = [object objectForKey:@"date"];

        UILabel *name = (UILabel*) [cell viewWithTag:203];
        name.text = [object objectForKey:@"name"];
    }
    if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]) {


        UILabel *game = (UILabel*) [cell viewWithTag:200];
        game.text = [NSString stringWithFormat:@"V.s %@", [object objectForKey:@"opponent"]];

        UILabel *points = (UILabel*) [cell viewWithTag:201];
        points.text = [NSString stringWithFormat:@"Points: %@G, %@A, %@Pts, %@, %@Hits, %@PPG",[object objectForKey:@"goals"], [object objectForKey:@"assists"], [object objectForKey:@"totalpoints"], [object objectForKey:@"plusminus"], [object objectForKey:@"hits"],[object objectForKey:@"ppg"]];

        UILabel *date = (UILabel*) [cell viewWithTag:250];
        date.text = [object objectForKey:@"date"];

        UILabel *name = (UILabel*) [cell viewWithTag:203];
        name.text = [object objectForKey:@"name"];



    }

    UILabel *game = (UILabel*) [cell viewWithTag:200];
    game.text = [NSString stringWithFormat:@"V.s %@", [object objectForKey:@"opponent"]];

    UILabel *points = (UILabel*) [cell viewWithTag:201];
    points.text = [NSString stringWithFormat:@"Points: %@G, %@A, %@Pts, %@, %@Hits, %@PPG",[object objectForKey:@"goals"], [object objectForKey:@"assists"], [object objectForKey:@"totalpoints"], [object objectForKey:@"plusminus"], [object objectForKey:@"hits"],[object objectForKey:@"ppg"]];

    UILabel *date = (UILabel*) [cell viewWithTag:250];
    date.text = [object objectForKey:@"date"];

    UILabel *name = (UILabel*) [cell viewWithTag:203];
    name.text = [object objectForKey:@"name"];


    return cell;
}
Was it helpful?

Solution

There are also A LOT of errors in your cellForRowAtIndexPath method.

(1) It contains a strange conditional.

a. First you're comparing pointers with the != operator:

if (tableView != self.searchDisplayController.searchResultsTableView)

But then you're comparing objects using isEqual

if ([tableView isEqual:self.searchDisplayController.searchResultsTableView])

Although either method is sufficient and this conditional should technically work, i's better to be consistent; and since tableView in cellForRowAtIndexPath holds a reference to a pointer, using the == or != operators are not only sufficient, but faster.

b. Also using two ifs in that way is poor form since you're having if statements for both of the two options. Instead I recommend using an if-else statement:

if (tableView != self.searchDisplayController.searchResultsTableView) {

   ...

} else {

    ...
}

return cell;

c. Your conditional, as it stands, is completely unnecessary. You have the same code in both conditional blocks and then again even AFTER the conditional block! So, as it stands, you can remove both if statements since the last code outside of the if statements is the only code that's really executed.

(2) But you do in fact need a conditional even though your current one is redundant.

The most major issue as to why the table wouldn't change while using the code you've specified:

Since you're using Parse's cellForRowAtIndexPath method, the row data is being populated with the info from - (PFQuery *)queryForTable, so as your code is currently written, the objects will be populated with the results of this query:

PFQuery *query = [PFQuery queryWithClassName:@"points"];

You can use the Parse PFObject parameter returned from this query when you're not searching, but use the object at the current index of the self.searchResults array, i.e. [self.searchResults objectAtIndex:indexPath.row], for when you are searching, ex:

if (tableView != self.searchDisplayController.searchResultsTableView) {

    UILabel *game = (UILabel*) [cell viewWithTag:200];
    game.text = [NSString stringWithFormat:@"V.s %@", [object objectForKey:@"opponent"]];

    UILabel *points = (UILabel*) [cell viewWithTag:201];
    points.text = [NSString stringWithFormat:@"Points: %@G, %@A, %@Pts, %@, %@Hits, %@PPG",[object objectForKey:@"goals"], [object objectForKey:@"assists"], [object objectForKey:@"totalpoints"], [object objectForKey:@"plusminus"], [object objectForKey:@"hits"], [object objectForKey:@"ppg"]];

    UILabel *date = (UILabel*) [cell viewWithTag:250];
    date.text = [object objectForKey:@"date"];

    UILabel *name = (UILabel*) [cell viewWithTag:203];
    name.text = [object objectForKey:@"name"];

} else {

    PFObject *searchResult = [self.searchResults objectAtIndex:indexPath.row];

    UILabel *game = (UILabel*) [cell viewWithTag:200];
    game.text = [NSString stringWithFormat:@"V.s %@", [searchResult objectForKey:@"opponent"]];

    UILabel *points = (UILabel*) [cell viewWithTag:201];
    points.text = [NSString stringWithFormat:@"Points: %@G, %@A, %@Pts, %@, %@Hits, %@PPG",[searchResult objectForKey:@"goals"], [searchResult objectForKey:@"assists"], [searchResult objectForKey:@"totalpoints"], [searchResult objectForKey:@"plusminus"], [searchResult objectForKey:@"hits"], [return cell; objectForKey:@"ppg"]];

    UILabel *date = (UILabel*) [cell viewWithTag:250];
    date.text = [searchResult objectForKey:@"date"];

    UILabel *name = (UILabel*) [cell viewWithTag:203];
    name.text = [searchResult objectForKey:@"name"];
}

return cell;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top