iOS8无法隐藏UISearchController中搜索栏上的取消按钮

dgu*_*taf 22 uisearchbar ios swift ios8 uisearchcontroller

我的目标是阻止取消按钮出现在UISearchController的搜索栏中.我从Apple的Table Search开始,使用UISearchController示例代码并隐藏了取消按钮,如下面的代码片段所示.但是,当用户点击文本字段时,仍会显示取消按钮.有帮助吗?

override func viewDidLoad() {
    super.viewDidLoad()

    resultsTableController = ResultsTableController()

    searchController = UISearchController(searchResultsController: resultsTableController)
    searchController.searchResultsUpdater = self
    searchController.searchBar.sizeToFit()
    tableView.tableHeaderView = searchController.searchBar

    searchController.searchBar.delegate = self

    //Hide cancel button - added by me
    searchController.searchBar.showsCancelButton = false

    ...
Run Code Online (Sandbox Code Playgroud)

nun*_*des 20

我认为有三种方法可以实现这一目标:

  1. 覆盖searchDisplayControllerDidBeginSearch并使用以下代码:

searchController.searchBar.showsCancelButton = false

  1. 子类UISearchBar并覆盖layoutSubviews以在系统尝试绘制var时更改该var.

  2. 注册键盘通知UIKeyboardWillShowNotification并应用第1点中的代码.

当然可以随时实现您的搜索栏.

  • 1:在iOS 8中被弃用.它取代了`didPresentSearchController:`在取消按钮已经显示后调用,导致闪存.2:我认为你不能告诉`UISearchController`使用搜索栏的自定义子类?3:键盘没有显示的情况怎么样?例如,如果键盘配对/连接? (7认同)

And*_*son 17

对于iOS 8和UISearchController,请使用以下的委托方法UISearchControllerDelegate:

func didPresentSearchController(searchController: UISearchController) {
  searchController.searchBar.showsCancelButton = false
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将自己设置为代表: searchController.delegate = self

  • 正如@jemmons所指出的那样,这会起作用,但会导致闪光,因为当它已经存在时我们会隐藏取消按钮. (8认同)

ma1*_*w28 14

简单地子类化UISearchController&UISearchBar.

class NoCancelButtonSearchController: UISearchController {
    let noCancelButtonSearchBar = NoCancelButtonSearchBar()
    override var searchBar: UISearchBar { return noCancelButtonSearchBar }
}

class NoCancelButtonSearchBar: UISearchBar {
    override func setShowsCancelButton(_ showsCancelButton: Bool, animated: Bool) { /* void */ }
}
Run Code Online (Sandbox Code Playgroud)