实现搜索栏功能 - Swift

Posted

技术标签:

【中文标题】实现搜索栏功能 - Swift【英文标题】:Implementing Search bar functionality - Swift 【发布时间】:2015-11-03 13:37:11 【问题描述】:

情况

我有一个应用程序可以从我构建的 API 中检索数据。检索数据后,它会将数据填充到 UITableView 中。

在我的 HTTP 请求中,我有以下代码,它将检索到的数据保存到一个数组中:

var dta = []

if let parseJSON = self.son 

                         self.dta = parseJSON
                    

之后我创建了一个搜索功能,如下所示:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) 
  //  if let id = dta["caseStudyTitle"] as? String
    filtered = dta.filter( (text) -> Bool in

        //if let id = Summary["caseStudyTitle"] as? String
        let tmp = text as! NSString
        let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
        print("THIS IS TEXT \(text)")
        return range.location != NSNotFound

    )
    if(filtered.count == 0)
        searchActive = false;
     else 
        searchActive = true;
    
    self.tableView.reloadData()

错误

运行上述代码后,出现以下错误:

Could not cast value of type '__NSCFDictionary' (0x10ef45c) to 'NSString' (0x460444).

在这一行:

let tmp = text as! NSString

数据结构

下面是JSON数据的结构,dta变量就是这个数据。

[  
    
  "_id":"qweqwqw",
  "caseStudyTitle":"Title",
  "caseStudyLink":"link",
  "sector":"sec one",
  "__v":0
,
  
  "_id":"qweqwqw",
  "caseStudyTitle":"Title",
  "caseStudyLink":"link",
  "sector":"sec one",
  "__v":0
, 
another object,
another object ]

结局

我希望能够过滤 UITableView 上显示的数据。 如果用户在搜索栏中输入内容,UITableView 会重新加载过滤后的数据。

另外我只需要搜索案例研究标题和行业字段。

如果您需要更多信息来解决此问题,请告诉我。

【问题讨论】:

您是否要根据标题或 JSON 对象的任何属性进行归档? @Caleb 过滤器基于标题和部门。只有这两个字段。 我建议为 JSON 对象中的数据创建一个类。过滤和我们以后会容易得多。如果您不想这样做,可以使用let tempTitle = text["caseStudyTitle"] as! String 访问标题和扇区。 @Caleb 谢谢你的回复。我只是对在哪里以及如何使用那行代码感到困惑。如果您查看我的代码,我将同一行注释掉。关于在当前代码中如何以及在何处实际实现这一行的任何建议?再次感谢 【参考方案1】:

您当前正在将 NSDictionary 转换为 NSString

以下是根据标题和部门进行过滤的方法:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) 
      //  if let id = dta["caseStudyTitle"] as? String
        filtered = dta.filter( (text) -> Bool in

        //Access the title and sectors
        let tmpTitle = text["caseStudyTitle"] as! String
        let tmpSector = text["sector"] as! String

        //Create a range for both
        let range1 = tmpTitle.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
        let range2 = tempSector.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
        print("THIS IS TEXT \(text)")
        //Return true if either match
        return range1 != nil || range2 != nil

    )
    if(filtered.count == 0)
        searchActive = false;
     else 
        searchActive = true;
    
    self.tableView.reloadData()

【讨论】:

再次感谢凯莱布。我从中学到了一些东西。实现您的代码后,我收到以下错误。 '范围类型的值?没有会员位置。有关如何解决此问题的任何建议? 更新:将“as!String”更改为“as!NSString”解决了这个问题。虽然我不知道为什么。 @LorenzovonMatterhorn 我忘了rangeOfStringStrings 的作用不同。我上面的编辑也解决了这个问题。【参考方案2】:

您的 dta 数组包含两个字典元素,而不是字符串元素。这就是为什么你得到一个错误,说你不能将字典转换成 nsstring。

让 tmp = 文本为! NSString

这里,文本是字典,而不是字符串。

【讨论】:

以上是关于实现搜索栏功能 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用UISearchController实现带搜索栏的表格

尝试在 Swift 中使用 UISearchResult。如何实现过滤?

Swift - 关闭搜索控制器

在 Swift 中实现搜索栏

使搜索功能快速响应 ui 搜索栏中键入的文本 [swift]

更改 UITableView 中的搜索栏高度(swift 5)