Вопрос

Я пытаюсь использовать UISearch панель для того, чтобы иметь возможность находить все объекты по определенному человеку.Я настроил его так, чтобы каждый PFUser или у пользователя есть объект name внутри основного объекта points.Когда я пытаюсь найти пользователя и там ничего не появляется, но в NSLogs я получаю всю информацию.Я думаю, что моя проблема заключается в cellForRowAtIndexPath, Но я не знаю почему!

Сначала я задаю вопрос:

- (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;
}

Я ставлю свою планку:

-(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];
}

Фильтрация результатов:

    -(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;
}

Пытаюсь показать все это!:

- (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;
}
Это было полезно?

Решение

Есть также МНОГО ошибок в вашем cellForRowAtIndexPath способ.

(1) Он содержит странное условие.

a. Сначала вы сравниваете указатели с != оператор:

if (tableView != self.searchDisplayController.searchResultsTableView)

Но тогда вы сравниваете объекты, используя isEqual

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

Хотя любого метода достаточно, и это условие должно технически работать, мне лучше быть последовательным;и поскольку TableView в cellForRowAtIndexPath удерживает ссылку на указатель, использование операторов == или != не только достаточно, но и быстрее.

b. Кроме того, использование двух "если" таким образом является плохой формой, поскольку у вас if утверждения для обоих из этих двух вариантов.Вместо этого я рекомендую использовать оператор if-else:

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

   ...

} else {

    ...
}

return cell;

c. Ваше условие в его нынешнем виде совершенно не нужно.У вас один и тот же код в обоих условных блоках, а затем снова даже ПОСЛЕ условного блока!Итак, в нынешнем виде вы можете удалить оба оператора if, поскольку последний код вне операторов if является единственным кодом, который действительно выполняется.

(2) Но ты делай на самом деле вам нужно условное обозначение, даже если ваше текущее является избыточным.

Самая серьезная проблема относительно того, почему таблица не изменится при использовании указанного вами кода:

Поскольку вы используете синтаксический анализ cellForRowAtIndexPath метод, данные строки заполняются информацией из - (PFQuery *)queryForTable, таким образом, поскольку ваш код в данный момент написан, объекты будут заполнены результатами этого запроса:

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

Вы можете использовать параметр Parse PFObject, возвращаемый из этого запроса, когда вы не выполняете поиск, но используйте объект с текущим индексом массива self.SearchResults, т.е. [self.searchResults objectAtIndex:indexPath.row], для тех случаев, когда вы ищете, например:

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top