0

我有一个 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 将如何匹配我正在寻找的两个字段。我在这里真的很困惑。

4

2 回答 2

1

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

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

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

于 2013-05-06T19:54:44.307 回答
0

你必须要做这样的事情

从 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];    
}
于 2013-05-06T23:41:02.133 回答