如何让我的 UISearchController 显示下面的单元格?

How can I make my UISearchController show the cells underneath?

我有一个 UITableViewController(有 6 个单元格)和一个 UISearchController。每当我点击搜索栏时,table 视图单元格就会消失,并被一个空的 table 视图所取代,直到我开始输入内容并出现搜索结果。当我点击搜索栏时,我怎样才能让单元格留在下面? 这是我关于 SearchController 的代码:

在 viewDidLoad() 中:

self.resultSearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = true
            controller.searchBar.sizeToFit()
            controller.searchBar.barTintColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1)

            self.tableView.tableHeaderView = controller.searchBar
            self.definesPresentationContext = true

            return controller
        })()

其余:

   override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if (self.resultSearchController.active) {
                return self.filteredTableData.count
            } else {
                return self.items.count
            }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
        var item : TextCell

        if (self.resultSearchController.active) {
            item = filteredTableData[indexPath.row]
            return cell
        } else {
            item = items[indexPath.row]
            cell.userText.text = item.userText
            cell.userPreferredName.text = item.userPreferredName
            cell.userName.text = item.userName

            cell.userImage.layer.cornerRadius = 23.75
            cell.userImage.clipsToBounds = true
            cell.userImage.layer.borderWidth = 0.3
            cell.userImage.layer.borderColor = UIColor.lightGrayColor().CGColor
            cell.time.text = "\((indexPath.row + 1) * 3)m"
            return cell
        }

    }
}

extension TableViewController: UITableViewDelegate {
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }

}

extension TableViewController: UISearchResultsUpdating {
    func updateSearchResultsForSearchController(searchController: UISearchController) {
        var filteredArray : [TextCell] = [TextCell]()

        for textCell in self.items
        {
            if (textCell.userName.rangeOfString(searchController.searchBar.text) != nil ||
                textCell.userPreferredName.rangeOfString(searchController.searchBar.text) != nil ||
                textCell.userText.rangeOfString(searchController.searchBar.text) != nil)
            {
                filteredArray.append(textCell)
            }
        }

        filteredTableData = filteredArray

        self.tableView.reloadData()
    }
}

截图:

奖金: 有没有办法让这些单元格选择table?

您可以做的是首先填充 filteredDataArray 而不进行过滤,然后在进行时应用过滤。在开始搜索之前,您不会将 filteredDataArray 设置为任何内容,因此在搜索开始时只需将其设置为完整数据集。

奖金:

您可以使用 tableViewDidSelectRowAtIndexPath 来捕获选择,这甚至可以用于搜索 table 视图。

如果 searchText 为空,则将 filteredTableData 设置为 items

extension TableViewController: UISearchResultsUpdating {
    func updateSearchResultsForSearchController(searchController: UISearchController) {
        var filteredArray : [TextCell] = [TextCell]()

        if searchController.searchBar.text == "" {
            filteredArray = self.items
        } else {
            for textCell in self.items
            {
                if (textCell.userName.rangeOfString(searchController.searchBar.text) != nil ||
                    textCell.userPreferredName.rangeOfString(searchController.searchBar.text) != nil ||
                    textCell.userText.rangeOfString(searchController.searchBar.text) != nil)
                {
                    filteredArray.append(textCell)
                }
            }
        }
        filteredTableData = filteredArray

        self.tableView.reloadData()
    }
}