了解如何将 UISearchBar 与 Core Data 一起使用

Posted

技术标签:

【中文标题】了解如何将 UISearchBar 与 Core Data 一起使用【英文标题】:Understanding how to use UISearchBar with Core Data 【发布时间】:2013-05-06 16:00:47 【问题描述】:

我有一个 iPad 应用程序(Xcode 4.6、ios 6.2、ARC 和 Storyboards)。我有一个包含原型单元格的 UITableView,带有两个标签(lName 和 lPhone)。我用核心数据存储的结果填充了一个 NSArray。我从示例中复制了代码,但我迷路了!我有两个要查找的字段:姓名和电话号码。我希望能够搜索任何一个。我尝试使用 UISearchBar 控制器,但结果跨越整个窗口,这是不可接受的。所以,我试图在没有控制器的情况下做到这一点。我希望搜索过滤 UITableView 中显示的条目,这段代码应该这样做。

当我执行 MR_findAll (MagicalRecord) 时,我获得了核心数据存储中的所有属性。这就是我迷失的地方 - 如何将两个属性从数组中取出并放入 NSMutableArray allTableData,或者在这种情况下是否有必要?

这是我的代码,到目前为止:

NSArray *allDataArray = [ClientInfo MR_findAll];

//  move objects from Core Data store to NSMutablearray
[allTableData addObjectsFromArray:allDataArray];

if(text.length == 0)  
    isFiltered = FALSE;

else  
    isFiltered = true;
    filteredTableData = [[NSMutableArray alloc] init];

    for (ClientCell* client in allTableData)  
        NSRange nameRange = [client.lName.text rangeOfString:text options:NSCaseInsensitiveSearch];
        NSRange phoneRange = [client.lPhone.text rangeOfString:text options:NSCaseInsensitiveSearch];

        if(nameRange.location != NSNotFound || phoneRange.location != NSNotFound)  
            [filteredTableData addObject:client];
        
    

我也不明白 NSRange 将如何匹配我正在寻找的两个字段。我真的很困惑。

【问题讨论】:

【参考方案1】:

rangeOfString 方法返回一个NSRange,当在接收器字符串中找到给定的子字符串时,其位置 等于 NSNotFound。您的代码所做的是首先检查 client.lName.text 和 client.lPhone.text 中搜索文本的范围。接下来,如果其中一个范围存在,则代码将该对象添加到filteredTableData。

至于仅将您的两个属性添加到filteredTableData,这根本不需要,因为您应该访问已经存储的对象来获取这些属性。

最后,我还建议您查看免费的 Sensible TableView 框架,因为它应该可以帮助您自动执行此类搜索。

【讨论】:

【参考方案2】:

你必须要做这样的事情

从 coredata 中获取数据到一个数组中,这是非常必要的,你有很多关于这方面的教程。

然后在搜索栏委托方法中实现一些类似的东西。它将开始过滤您的数组,以便您可以看到所需的结果

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar

    self.tableView.allowsSelection = YES;
    self.tableView.scrollEnabled = YES;
    NSArray *list = [[NSArray alloc] initWithArray:artists];  
    if (searchBar.text && [searchBar.text length] > 0)
    
        NSMutableArray *filterContacts = [[NSMutableArray alloc]initWithArray:list];
     //    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title LIKE %@",searchBar.text ];  
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title CONTAINS[c] %@",searchBar.text ];
        [filterContacts filterUsingPredicate:predicate];
        artists = filterContacts;
    

    [self.tableView reloadData];
    [self updateSearchString:searchBar.text];    

【讨论】:

以上是关于了解如何将 UISearchBar 与 Core Data 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?

UISearchBar 不在 TableViewController 的表视图标题中?

将 UIRefreshControl 与 UISearchBar 搜索结果一起使用

如何将 UiSearchBar 的背景颜色更改为黑色-SWIFT

如何将图像设置为 UISearchBar 的范围栏项目?

为啥黑色半透明 UIToolbar 的顶部与黑色半透明 UISearchBar 不同,如何使它们看起来相同?