了解如何将 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 搜索结果一起使用