Ios parse.com上的搜索功能将搜索结果覆盖在原始tableview上
我对这一点非常陌生,尝试使用Parse.com作为后端服务器。我正在建立一个蔬菜数据库,想对parse.com上的列表进行搜索。除了一件烦人的事之外,我的一切都在运转 现在,我使用故事板创建了一个自定义单元格,其中包括一个PFImage缩略图视图、一个显示蔬菜的标签,然后是另一个显示蔬菜季节的标签 调用viewcontroller时,列表将完全填充,并按字母顺序列出蔬菜。然后我向下拖动窗口以显示搜索栏。我开始输入一个菜名,当我这样做时,原始表数据行开始消失,但问题是原始表数据仍然存在。例如,我会输入carrot,所有的行都消失了,除了上面那一行还有洋蓟的缩略图和标签洋蓟。但在这一行上还覆盖着胡萝卜这个词,这是列表中的另一种蔬菜。如果我点击它,它将正确地连接到显示胡萝卜的局部视图控制器。所以一切都正常,但我不知道如何使搜索结果不会覆盖原始数据 以下是代码部分:Ios parse.com上的搜索功能将搜索结果覆盖在原始tableview上,ios,objective-c,parse-platform,Ios,Objective C,Parse Platform,我对这一点非常陌生,尝试使用Parse.com作为后端服务器。我正在建立一个蔬菜数据库,想对parse.com上的列表进行搜索。除了一件烦人的事之外,我的一切都在运转 现在,我使用故事板创建了一个自定义单元格,其中包括一个PFImage缩略图视图、一个显示蔬菜的标签,然后是另一个显示蔬菜季节的标签 调用viewcontroller时,列表将完全填充,并按字母顺序列出蔬菜。然后我向下拖动窗口以显示搜索栏。我开始输入一个菜名,当我这样做时,原始表数据行开始消失,但问题是原始表数据仍然存在。例如,我会
- (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的属性。如果我帮助您,您介意将我的答案标记为正确吗?