将过滤器按钮添加到UISearchController

时间:2016-01-27 12:35:44

标签: ios swift uitableview uisearchbar uisearchcontroller

我想在searchBar内的UISearchController旁边添加“过滤器”或“排序”按钮。我已尝试将UIButtonsearchbar添加到UIView并将其设置为UITableView tableView.tableHeaderView这不起作用,因为tableView.tableHeaderView获取后退只有在解雇控制器时才到UISearchBar。以下是我希望它的外观示例:enter image description here

5 个答案:

答案 0 :(得分:7)

我可以创建一个包含几行代码的搜索过滤器。我希望它有所帮助。

*我选择了书签按钮来应用过滤器图标;因为我已经使用了取消按钮进行自定义操作。

首先,您必须委托searchBar来处理书签按钮点击操作。 然后你应该设置如下属性。如果要提供自定义位置(默认位置是右侧),则需要setPositionAdjustment。

searchController.searchBar.delegate = self
searchController.searchBar.showsBookmarkButton = true
searchController.searchBar.setImage(UIImage(named: "Sort"), for: .bookmark, state: .normal)
// MARK: You may change position of bookmark button.
//searchController.searchBar.setPositionAdjustment(UIOffset(horizontal: 0, vertical: 0), for: .bookmark)

然后,覆盖VC中的searchBarBookmarkButtonClicked函数。您可以在此方法中处理click事件。

func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) { //showAlert, presentVC or whatever you want here }

此外,如果您想在搜索控制器处于活动状态时隐藏书签按钮,则需要在updateSearchResults方法中应用控件。

if searchController.isActive {
    searchController.searchBar.showsBookmarkButton = false
} else {
    searchController.searchBar.showsBookmarkButton = true
}


当searchController未激活时:

While searchController is not active


当searchController处于活动状态时:

searchController is active

答案 1 :(得分:6)

您可以通过在SearchBar旁添加自己的按钮来保持简单,而不是自定义UISearchBar并使事情变得复杂。

使用

为SearchBar设置否显示取消按钮选项
self.searchBar.showsCancelButton = true

OR

在StoryBoard中取消选中SearchBar的显示取消按钮选项

enter image description here

在SearchBar旁边添加您自己的按钮,如下所示

enter image description here

然后相应地将IBaction添加到按钮并在其中执行操作。

同样在理想情况下,不建议将此视图放在tableview的Header中。 如果它高于tableview,那么Apple会更好。

enter image description here

答案 2 :(得分:3)

我尝试了很多方法来自定义搜索栏,但没有任何帮助我终于找到了满足您需求的方法

let mysearchController = UISearchController(searchResultsController: nil)
    mysearchController.searchBar.showsCancelButton = true
    mysearchController.searchBar.barStyle = UIBarStyle.Black
    for var subView1 in mysearchController.searchBar.subviews{
        for var subView2 in subView1.subviews{
            if subView2 .isKindOfClass(UIButton){
                let customizedCancelButton:UIButton = subView2 as! UIButton
                customizedCancelButton.enabled = true
                customizedCancelButton.setTitle("", forState: UIControlState.Normal)
                 let image1 = UIImage(named: "Sort")
                customizedCancelButton.setBackgroundImage(image1, forState: UIControlState.Normal)
                customizedCancelButton.addTarget(self, action: "sort", forControlEvents: UIControlEvents.TouchUpInside)
            }
        }
    }

上面的代码很容易理解。

    func sort(){
       print("sort button fired!!!")
    }

enter image description here

答案 3 :(得分:1)

针对iOS 13更新,基于Gokul G答案,支持iOS的早期版本。

将扩展文件添加到项目— UISearchControllerCancelButton.swift(View on gist.github.com):

extension UISearchController {
    func cancelButton() -> UIButton? {
        if #available(iOS 13.0, *) {
            return findCancelButton13()
        }
        return findCancelButtonOld()
    }

    func findCancelButtonOld() -> UIButton? {
        for subView in searchBar.subviews {
            for v in subView.subviews {
                if let button = v as? UIButton {
                    return button
                }
            }
        }
        return nil
    }

    @available(iOS 13.0, *)
    func findCancelButton13() -> UIButton? {
        for subView in searchBar.subviews {
            for v in subView.subviews {
                for b in v.subviews {
                    if let button = b as? UIButton {
                        return button
                    }
                }
            }
        }
        return nil
    }
}

使用:

let controller = UISearchController(searchResultsController: nil)
controller.searchBar.showsCancelButton = true

if let button = controller.cancelButton() {
    // Customize button
    let iconImage = UIImage(named: "yourIconName")
    button.isEnabled = true
    button.setTitle("", for: .normal)
    button.setBackgroundImage(iconImage, for: .normal)
    button.addTarget(self, action: #selector(yourMethodName), for: .touchUpInside)
}

按钮触摸事件的方法声明:

@objc func yourMethodName() {
    print("Cancel button tap")
}

答案 4 :(得分:0)

我失去了搜索控制器,它没有提供您想要的任何功能,而您需要提供的额外视图/ VC会增加复杂性/代码重复。

您现有的表格视图已经包含您需要的所有内容,因为它具有数据源。这可能是阵列也可能是FRC。如果它是一个数组,那么您可以用过滤的内容替换数组的内容,如果它是FRC,您可以更改谓词。

注意:在数组的情况下,有2个数组引用,1表示包含所有未过滤项的数组,另一个最初是对同一数组的引用 - 第二个引用用于填充表视图。然后,在过滤时,创建一个仅包含过滤项的新数组,并将第二个引用指向该数组。

不是实现搜索控制器委托方法,而是实现搜索栏委托方法,并使用它来触发过滤和重置。

现在你已经摆脱了搜索控制器,你也没有切换表视图,所以你只有1个电视和1个标题视图。现在没有理由改变标题视图,一切正常。