我想在searchBar
内的UISearchController
旁边添加“过滤器”或“排序”按钮。我已尝试将UIButton
和searchbar
添加到UIView
并将其设置为UITableView tableView.tableHeaderView
这不起作用,因为tableView.tableHeaderView
获取后退只有在解雇控制器时才到UISearchBar
。以下是我希望它的外观示例:
答案 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未激活时:
当searchController处于活动状态时:
答案 1 :(得分:6)
您可以通过在SearchBar旁添加自己的按钮来保持简单,而不是自定义UISearchBar并使事情变得复杂。
使用
为SearchBar设置否显示取消按钮选项self.searchBar.showsCancelButton = true
OR
在StoryBoard中取消选中SearchBar的显示取消按钮选项
在SearchBar旁边添加您自己的按钮,如下所示
然后相应地将IBaction添加到按钮并在其中执行操作。
同样在理想情况下,不建议将此视图放在tableview的Header中。 如果它高于tableview,那么Apple会更好。
答案 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!!!")
}
答案 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个标题视图。现在没有理由改变标题视图,一切正常。