Ios parse.com上的搜索功能将搜索结果覆盖在原始tableview上

Ios parse.com上的搜索功能将搜索结果覆盖在原始tableview上,ios,objective-c,parse-platform,Ios,Objective C,Parse Platform,我对这一点非常陌生,尝试使用Parse.com作为后端服务器。我正在建立一个蔬菜数据库,想对parse.com上的列表进行搜索。除了一件烦人的事之外,我的一切都在运转 现在,我使用故事板创建了一个自定义单元格,其中包括一个PFImage缩略图视图、一个显示蔬菜的标签,然后是另一个显示蔬菜季节的标签 调用viewcontroller时,列表将完全填充,并按字母顺序列出蔬菜。然后我向下拖动窗口以显示搜索栏。我开始输入一个菜名,当我这样做时,原始表数据行开始消失,但问题是原始表数据仍然存在。例如,我会

我对这一点非常陌生,尝试使用Parse.com作为后端服务器。我正在建立一个蔬菜数据库,想对parse.com上的列表进行搜索。除了一件烦人的事之外,我的一切都在运转

现在,我使用故事板创建了一个自定义单元格,其中包括一个PFImage缩略图视图、一个显示蔬菜的标签,然后是另一个显示蔬菜季节的标签

调用viewcontroller时,列表将完全填充,并按字母顺序列出蔬菜。然后我向下拖动窗口以显示搜索栏。我开始输入一个菜名,当我这样做时,原始表数据行开始消失,但问题是原始表数据仍然存在。例如,我会输入carrot,所有的行都消失了,除了上面那一行还有洋蓟的缩略图和标签洋蓟。但在这一行上还覆盖着胡萝卜这个词,这是列表中的另一种蔬菜。如果我点击它,它将正确地连接到显示胡萝卜的局部视图控制器。所以一切都正常,但我不知道如何使搜索结果不会覆盖原始数据

以下是代码部分:

- (void)viewDidLoad
{

    self.tableView.backgroundColor = [UIColor clearColor];
    self.tableView.backgroundView=[[UIImageView alloc] initWithImage:
                                   [UIImage imageNamed:@"bg.jpg"]];

    [super viewDidLoad];

    //add the search bar
    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];
    //done adding search bar
}

- (PFQuery *)queryForTable
{
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];

    // 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 orderByAscending:@"vegetable"];

    return query;
}

// Override to customize the look of a cell representing an object. The default is to display
// a UITableViewCellStyleDefault style cell with the label being the first key in the object.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{

    static NSString *simpleTableIdentifier = @"VegetableCell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    // more search stuff

    if (tableView == self.tableView) {
        cell.backgroundColor = cell.backgroundColor;

    }

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

        PFObject *searchedVeggie = [self.searchResults objectAtIndex:indexPath.row];
        cell.textLabel.text = [searchedVeggie objectForKey:@"vegetable"];
        cell.backgroundColor = [UIColor whiteColor];
        tableView.rowHeight = self.tableView.rowHeight;
    }


    PFFile *thumbnail = [object objectForKey:@"vegetableImageFile"];
    PFImageView *thumbnailImageView = (PFImageView*)[cell viewWithTag:100];
    thumbnailImageView.image = [UIImage imageNamed:@"placeholder.jpg"];
    thumbnailImageView.file = thumbnail;
    [thumbnailImageView loadInBackground];

    UILabel *vegetableName = (UILabel*) [cell viewWithTag:101];
    vegetableName.text = [object objectForKey:@"vegetable"];

    UILabel *vegetableSeason = (UILabel*) [cell viewWithTag:102];
    vegetableSeason.text = [object objectForKey:@"vegetableSeason"];
    return cell;

}
代码下面是我的prepareForSeque代码和其他搜索方法。我知道重复代码有点难看,但我一直在尝试各种方法来解决我的问题,在我找到问题之前,我不会去清理东西。此外,我还在parse.com的数据浏览器上创建了一个名为lowerCaseVegetable的新列,因为搜索区分大小写。因此,搜索实际上是在该列上执行的,但是使用普通蔬菜列显示,该列的蔬菜名称大写

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showVegetableDetail"]) {

        if (self.searchDisplayController.active) {
            NSLog(@"Search Display Controller");
            VeggieDetailViewController *destViewController = segue.destinationViewController;

            PFObject *object = [self.searchResults objectAtIndex: self.searchDisplayController.searchResultsTableView.indexPathForSelectedRow.row];
            Vegetables *vegetables = [[Vegetables alloc] init];
            vegetables.vegetable = [object objectForKey:@"vegetable"];
            vegetables.vegetableInfo = [object objectForKey:@"vegetableInfo"];
            vegetables.vegetableImageFile = [object objectForKey:@"vegetableImageFile"];
            vegetables.vegetableSeason = [object objectForKey:@"vegetableSeason"];
            destViewController.vegetables = vegetables;

        } else {
            NSLog(@"Default Display Controller");

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        VeggieDetailViewController *destViewController = segue.destinationViewController;

        PFObject *object = [self.objects objectAtIndex:indexPath.row];
        Vegetables *vegetables = [[Vegetables alloc] init];
        vegetables.vegetable = [object objectForKey:@"vegetable"];
        vegetables.vegetableInfo = [object objectForKey:@"vegetableInfo"];
        vegetables.vegetableImageFile = [object objectForKey:@"vegetableImageFile"];
        vegetables.vegetableSeason = [object objectForKey:@"vegetableSeason"];
        destViewController.vegetables = vegetables;
        }
    }
}

// other search stuff

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

    [self.searchResults removeAllObjects];
    PFQuery *query = [PFQuery queryWithClassName: @"Vegetables"];
    [query whereKeyExists:@"lowerCaseVegetable"];
    [query whereKey:@"lowerCaseVegetable" containsString:searchTerm];
    NSArray *results = [query findObjects];
    [self.searchResults addObjectsFromArray:results];
}

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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.tableView) {
        return self.objects.count;
    } else {
        return self.searchResults.count;
    }
}

-(void)callbackLoadObjectsFromParse:(NSArray *)result error:(NSError *)error {
    if (!error) {
        [self.searchResults removeAllObjects];
        [self.searchResults addObjectsFromArray:result];
        [self.searchDisplayController.searchResultsTableView reloadData];
    } else {
//        NSLog(@”Error: %@ %@”, [error userInfo]);
    }
}

我有一种感觉,我在这里犯了一个愚蠢的新手错误,但我从五月份开始就一直这样做,在过去的两周里,我一直在努力解决这个问题。我想是时候寻求帮助了。

我刚刚在我的解析应用程序中实现了搜索,我想我看到了问题:

在filterResults方法中,尝试使用findObjectsInBackgroundWithBlock而不是findObjects,如下所示:

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

         [self.searchResults addObjectsFromArray:array];
        [self.searchDisplayController.searchResultsTableView reloadData];

    }];
准备表格:

Vegetables *vegetables = [[Vegetables alloc] init];
   vegetables.vegetable = [self.selectedObject objectForKey:@"vegetable"];
   vegetables.vegetableInfo = [self.selectedObject objectForKey:@"vegetableInfo"];
   vegetables.vegetableImageFile = [self.selectedObject objectForKey:@"vegetableImageFile"];
   vegetables.vegetableSeason = [self.selectedObject objectForKey:@"vegetableSeason"];
   destViewController.vegetables = vegetables;

该代码确实解决了我遇到的另一个问题。我在搜索功能期间遇到一个关于长时间运行的进程的错误。我读过关于在BackgroundWithBlock中实现FindObjects的文章,但自从我与我的主要问题作斗争以来,我一直没有着手解决它。我继续尝试了你的代码建议,结果搜索结果翻了一番。当我输入胡萝卜时,它在我的搜索结果中显示了两次胡萝卜。我注释掉了第一行[query whereKeyExists],现在它显示单个条目。。。但仍然将胡萝卜文本覆盖在朝鲜蓟缩略图的顶部。@user3745566-hmm有趣。我唯一能建议的另一件事是将cellForRowAtIndexPath中的缩略图代码移动到TableView的if语句中。我知道这两种说法都是如此,但试一下吧;我移动了缩略代码,至少那部分是固定的。不幸的是,原文本和季节的其他领域仍然存在。所以我所做的被称为vegetableName.text=nil;蔬菜季节=零;在if/else搜索语句中,现在搜索结果位于基本的白色表格视图中,无需再覆盖即可。现在唯一的问题是,当我搜索胡萝卜,然后点击“胡萝卜”,当它出现时,它不会像以前那样与显示在细节视图控制器中的图像文件保持一致。不过,我想是越来越近了。谢谢@user3745566我要做的是在didSelectRowAtIndexPath中将所选对象保存到视图控制器的PFObject属性中,调用它selectedObject,然后在prepareForSegue中使用它,而不必在那里使用if语句。让我知道它是否有效!我目前还没有足够的技能来尝试编写您所解释的代码,但我会读一些书来尝试理解它。我至少知道如何添加方法,所以这没有问题。虽然我知道如何创建PFObject变量,但我目前不知道如何将其作为viewcontroller的属性。如果我帮助您,您介意将我的答案标记为正确吗?