无论是不是有搜索文本匹配,UISearchBar 都显示“无结果”

Posted

技术标签:

【中文标题】无论是不是有搜索文本匹配,UISearchBar 都显示“无结果”【英文标题】:UISearchBar shows "No Results" whether if there are search text matches or not无论是否有搜索文本匹配,UISearchBar 都显示“无结果” 【发布时间】:2014-03-16 16:46:13 【问题描述】:

我正在使用表格视图搜索栏来搜索我的核心数据内容并在UITableView 中显示匹配的内容。

问题是,如果您输入与某些内容匹配的搜索文本,TableView 是否显示“无结果”。

谁能告诉我为什么?

TableViewController 代码:

 (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

    NSManagedObjectContext *context = [self managedObjectContext];

    if (editingStyle == UITableViewCellEditingStyleDelete) 
        // Delete object from database
        [context deleteObject:[self.cart objectAtIndex:indexPath.row]];

        NSError *error = nil;
        if (![context save:&error]) 
            NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
            return;
        

        // Remove device from table view
        [self.cart removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    


//Searchbar
#pragma mark Content Filtering
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
    // Update the filtered array based on the search text and scope.
    // Remove all objects from the filtered search array
    [self.filteredProductsArray removeAllObjects];
    // Filter the array using NSPredicate
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Cart.cartProductName contains[c] %@",searchText];
    filteredProductsArray = [NSMutableArray arrayWithArray:[cartProducts filteredArrayUsingPredicate:predicate]];


#pragma mark - UISearchDisplayController Delegate Methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
    // Tells the table data source to reload when text changes
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    // Return YES to cause the search result table view to be reloaded.
    return YES;


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption 
    // Tells the table data source to reload when scope bar selection changes
    [self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
    // Return YES to cause the search result table view to be reloaded.
    return YES;

核心数据内容在 Cart.h 中,属性为 cartProductName,即 NSString

更新:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    NSManagedObject *device = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView)
        device = [filteredProductsArray objectAtIndex:indexPath.row];
    else
        device = [self.cart objectAtIndex:indexPath.row]; 

    if (cell.accessoryView == nil) 
        // Only configure the Checkbox control once.
        cell.accessoryView = [[Checkbox alloc] initWithFrame:CGRectMake(0, 0, 25, 43)];
        cell.accessoryView.opaque = NO;
        cell.backgroundColor = [UIColor clearColor];

       [(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged];

    [cell.textLabel setText:[NSString stringWithFormat:@"%@", [device valueForKey:@"cartProductName"]]];
     //[(Checkbox*)cell.accessoryView setChecked: [((Cart*)device).checked boolValue]];

    //Accessibility

    [self updateAccessibilityForCell:cell];

return cell;

    return nil;

更新:CartTableViewController.m:

#import "CartViewController.h"
#import "Checkbox.h"
#import "Cart.h"


@interface CartViewController ()
@property (strong) NSMutableArray *cart;

@end

@implementation CartViewController 
    NSArray *cartProducts;


@synthesize filteredProductsArray;
@synthesize searchBar;

【问题讨论】:

【参考方案1】:

您提供了一些细节来了解问题所在,但我猜您的 -(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 应该是这样的:

[self.filteredProductsArray removeAllObjects];

NSFetchRequest *fetchRequest = // set up the fetch request for your Cart entity here...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cartProductName contains[cd] %@", searchText];
fetchRequest.predicate = predicate;

NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if (results == nil) 
    // handle error here...


[self.filteredProductsArray addObjectsFromArray:results];

可以在Searching in UITableView 找到一个关于如何实现此目标的非常好的示例。

性能考虑。当使用cd 时,研究会比不使用它慢。所以,你可以直接使用contains

希望对您有所帮助。

【讨论】:

您好,感谢您迄今为止的帮助。你需要什么样的细节?遗憾的是,您的解决方案产生了一些错误:1.'使用未声明的标识符'谓词',2.'意外的接口名称'NSPredicate':预期的表达式' 你听从我的建议了吗? @user255368 GitHub 上的教程?怎么下载? 我提供的 sn-p。未创建提取请求。此外,如果您点击我提供的链接,您可以查看源代码。 @user255368 您是否正确实现了表视图委托方法? @user255368

以上是关于无论是不是有搜索文本匹配,UISearchBar 都显示“无结果”的主要内容,如果未能解决你的问题,请参考以下文章

字段为空时为 UISearchBar 启用“搜索”按钮? (IOS 7)

编辑搜索栏中的文本时出现 UISearchBar 问题

使 UISearchBar 在两个不同的字段上进行搜索

在 becomeFirstResponder 上禁用 UISearchBar 搜索图标和占位符文本动画

Swift iOS 8+ UISearchBar图标,占位符和文本居中

使用 UISearchBar 文本搜索 UITableView 单元格