如何使用在执行UISearch并过滤

时间:2016-01-05 00:34:47

标签: ios swift uitableview

我一直在使用TableView和UISearch栏创建和应用。单元格是可选择的,但问题是我有单元格预先形成segues如果它们被选中。

此代码:

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if (indexPath.row == 0){
        self.performSegueWithIdentifier("First", sender: tableView)
    }

当用户完成过滤搜索时,这些单元格现在包含不同的文本。所以他们点击的东西就是错误的观点。如果Row等于我的数组中的特定Sting,那么他们是否可以使我的if语句成为上述。

我的数组: var menu = ["first", "Second", "Third","Fourth", "Fifth", "Sixth"]

当用户没有进行搜索时,他们的单元格和文本匹配但是一旦用户进行搜索,单元格就会保留在与segue相同的位置,但单元格所具有的文本是不同的。

主要问题:单元格文本不等于搜索和过滤后应显示的右视图。无论细胞文本是什么,它们都只是在喋喋不休。

如果有人可以向我提供新代码或调整现有代码,那就太棒了。 如有任何问题,或者您需要和澄清,请向我询问。我的所有代码都很快。谢谢您的帮助!

新代码:

  func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {

    filtered = menu.filter({ (text) -> Bool in
        let tmp: NSString = text
        let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
        return range.location != NSNotFound

        let menu = ["First", "Second", "Third","Fourth", "Fifth", "Sixth"]
        // when a search is done you check if your array contains the search result
        if menu.contains(searchBar.text!) {
            // you change the search to lowercase
            // so keep all your segue identifiers with lowercase strings
            let identifier = searchBar.text!.lowercaseString
            // perform the segue
            self.performSegueWithIdentifier(identifier, sender: tableView)




        }

2 个答案:

答案 0 :(得分:1)

所以你有了searchBar,当你进行搜索时,你会得到搜索中的关键字,那么你可以这样做:

// Your array
let menu = ["first", "Second", "Third","Fourth", "Fifth", "Sixth"]
// when a search is done you check if your array contains the search result
if menu.contains(searchBar.text) {
      // you change the search to lowercase
      // so keep all your segue identifiers with lowercase strings
      let identifier = searchBar.text.lowercaseString
      // perform the segue
      self.performSegueWithIdentifier(identifier, sender: tableView)
}

<强>更新
如果您想要连续segue,请执行以下操作

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let identifier = menu[indexPath.row]
    self.performSegueWithIdentifier(identifier, sender: tableView)

更新2

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        let menu = ["first" , "Second", "Third","Fourth", "Fifth", "Sixth"]
        // when a search is done you check if your array contains the search result
        // if yes
        if menu.contains(searchText.text!) {
            // you change the saerchText to lowercase
            // so keep all your segue identifiers with lowercase strings
            let identifier = searchbar.text!.lowercaseString
            // perform the segue
            self.performSegueWithIdentifier("identifier", sender: tableView)
        }
    })

解决OP问题的最终解决方案

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)

    let menu = ["first", "second", "third","fourth", "fifth", "sixth"]
    // when a search is done you check if your array contains the search result

    let identifier = cell?.textLabel?.text!.lowercaseString

    if menu.contains(identifier!) {
        // you change the search to lowercase
        // so keep all your segue identifiers with lowercase strings
        // perform the segue
        self.performSegueWithIdentifier(identifier!, sender: tableView)  
    }
}

答案 1 :(得分:0)

当用户进行搜索时,结果是在新数组中排序还是数据在初始数组中排序?

如果数据在不同的数组中排序,您只需添加一个布尔标志,指示表视图何时需要使用过滤后的数组。所以在你的

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:     
}

你可以

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if (userHasSearch){
        //  Something with the filtered array of data
    } else {
        //  Something with the initial array
    }

希望这有帮助!