将filter按钮添加到UISearchController

我想在UISearchControllersearchBar旁边添加一个“filter”或“排序”按钮。 我已经尝试将UIButton和搜索searchbar添加到UIView并将其设置为我的UITableView tableView.tableHeaderView这不起作用,因为tableView.tableHeaderView只有在解除控制器时才会设置回UISearchBar 。 以下是我希望它的外观示例: 在此处输入图像描述

我可以用几行代码创建一个搜索filter。 我希望它有所帮助。

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

首先,您必须委托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未激活

searchController处于活动状态

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

使用为SearchBar设置No the Shows取消按钮选项

 self.searchBar.showsCancelButton = true 

要么

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

在此处输入图像描述

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

在此处输入图像描述

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

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

在此处输入图像描述

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

 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!!!") } 

在此处输入图像描述

我失去了搜索控制器,它不提供你想要的任何function,你需要提供的额外视图/ VC增加了复杂性/代码重复。

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

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

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

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