为什么我的 SearchController 只匹配第一个字符?
Why does my SearchController only match the first character?
我有像这样的字典格式的数据:
var data: [[String:AnyObject]] =
[
[
"id": "1",
"title": "A Title",
"Detail": "This is a String"
],
[
"id": "2",
"title": "A Title Again",
"Detail": "This is a String"
]
]
我的 TableViewController 列出了所有 "title" 数据。
我正在实现一个 SearchController,供用户仅从 "title" 搜索特定数据。
我的代码似乎只显示匹配搜索查询中第一个字符的结果。
例如:如果用户输入"A",则显示所有带有"A"的标题结果,但如果用户继续输入"A "(带有space),搜索结果中的所有内容都消失了。
这是我的尝试:
class TVC: UITableViewController, UISearchResultsUpdating {
let Search = data
var filteredSearch = [[String:AnyObject]]()
var resultSearchController = UISearchController()
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.resultSearchController.active)
{
return self.filteredSearch.count
}
else
{
return self.Search.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell?
if (self.resultSearchController.active)
{
cell!.textLabel?.text = (filteredSearch[indexPath.row]["title"] as! String)
return cell!
}
else
{
cell!.textLabel?.text = (Search[indexPath.row]["title"] as! String)
return cell!
}
}
func updateSearchResultsForSearchController(searchController: UISearchController)
{
self.filteredSearch.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (self.Search as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredSearch = array as! [[String:AnyObject]]
self.tableView.reloadData()
}
你的谓词错了。现在设置的方式,谓词中的 self
指的是数组中的对象,它们是字典,而字典没有子字符串:) 为了让它工作,我们必须告诉谓词检查值在特定的键下。这可以通过两种方式完成:
let searchPredicate = NSPredicate(format: "title CONTAINS[c] %@", searchController.searchBar.text!)
// OR
let searchPredicate = NSPredicate(format: "SELF[\"title\"] CONTAINS[c] %@", searchController.searchBar.text!)
这样,谓词将检查 title
键下的值是否包含搜索栏中的文本。
我不知道为什么它只用一个字母。
我有像这样的字典格式的数据:
var data: [[String:AnyObject]] =
[
[
"id": "1",
"title": "A Title",
"Detail": "This is a String"
],
[
"id": "2",
"title": "A Title Again",
"Detail": "This is a String"
]
]
我的 TableViewController 列出了所有 "title" 数据。
我正在实现一个 SearchController,供用户仅从 "title" 搜索特定数据。
我的代码似乎只显示匹配搜索查询中第一个字符的结果。
例如:如果用户输入"A",则显示所有带有"A"的标题结果,但如果用户继续输入"A "(带有space),搜索结果中的所有内容都消失了。
这是我的尝试:
class TVC: UITableViewController, UISearchResultsUpdating {
let Search = data
var filteredSearch = [[String:AnyObject]]()
var resultSearchController = UISearchController()
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.resultSearchController.active)
{
return self.filteredSearch.count
}
else
{
return self.Search.count
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell?
if (self.resultSearchController.active)
{
cell!.textLabel?.text = (filteredSearch[indexPath.row]["title"] as! String)
return cell!
}
else
{
cell!.textLabel?.text = (Search[indexPath.row]["title"] as! String)
return cell!
}
}
func updateSearchResultsForSearchController(searchController: UISearchController)
{
self.filteredSearch.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (self.Search as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredSearch = array as! [[String:AnyObject]]
self.tableView.reloadData()
}
你的谓词错了。现在设置的方式,谓词中的 self
指的是数组中的对象,它们是字典,而字典没有子字符串:) 为了让它工作,我们必须告诉谓词检查值在特定的键下。这可以通过两种方式完成:
let searchPredicate = NSPredicate(format: "title CONTAINS[c] %@", searchController.searchBar.text!)
// OR
let searchPredicate = NSPredicate(format: "SELF[\"title\"] CONTAINS[c] %@", searchController.searchBar.text!)
这样,谓词将检查 title
键下的值是否包含搜索栏中的文本。
我不知道为什么它只用一个字母。