【问题标题】:Understanding how to use UISearchBar with Core Data了解如何将 UISearchBar 与 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 将如何匹配我正在寻找的两个字段。我真的很困惑。

【问题讨论】:

    标签: ios objective-c core-data magicalrecord


    【解决方案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];    
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多