实现搜索栏功能 - Swift

时间:2015-11-03 13:37:11

标签: swift uitableview swift2 uisearchbar

情况

我有一个应用程序,它从我构建的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将使用过滤后的数据重新加载。

此外,我只需要搜索案例研究标题&部门领域。

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

2 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:0)

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

让tmp =文字为!的NSString

这里,text是字典,而不是String。