为什么我的 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 键下的值是否包含搜索栏中的文本。

我不知道为什么它只用一个字母。