实现搜索栏功能 - 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 我忘了rangeOfString
对Strings
的作用不同。我上面的编辑也解决了这个问题。【参考方案2】:
您的 dta 数组包含两个字典元素,而不是字符串元素。这就是为什么你得到一个错误,说你不能将字典转换成 nsstring。
让 tmp = 文本为! NSString
这里,文本是字典,而不是字符串。
【讨论】:
以上是关于实现搜索栏功能 - Swift的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 使用UISearchController实现带搜索栏的表格
尝试在 Swift 中使用 UISearchResult。如何实现过滤?