Cancel button is not shown in UISearchBar

被刻印的时光 ゝ 提交于 2019-11-28 09:45:59

iOS7 does not show the cancel button when added to a navigation bar.You can put searchbar in another view like this.

UISearchBar *searchBar = [UISearchBar new];
searchBar.showsCancelButton = YES;
[searchBar sizeToFit];
UIView *viewForSearchBar = [[UIView alloc]initWithFrame:searchBar.bounds];
[viewForSearchBar addSubview:searchBar];
self.navigationItem.titleView = viewForSearchBar;
Tal Haham

I had the same problem, on iPhone the search cancel was shown well, but on iPad it didn't.

The workaround of wrapping the UISearchBar in another UIView didn't work well for me since it had different appearance and wrong width on rotation.

My solution is a simple one - use search WITHOUT cancel, and add cancel as a UIBarButtonItem.

Try this. Add a checkmark for shows cancel button.

Added rightBarButtonItem with selector will work fine for me. And adding searchBar inside view before setting to navigation title view was not showing properly.
Code:- 
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.dismissView))
func dismissView() {
        if self.controller?.navigationController?.popViewController(animated: true) == nil {
            self.controller?.dismiss(animated: true, completion: nil)
        }
    }

Swift version :-

I tried the @Nikita Khandelwal method, but still it doesn't fit for ipad view. Here is the swift code, which was given as corrected answer :-

let searchBar: UISearchBar = UISearchBar()
searchBar.showCancelButton = true
searchBar.placeholder = "Search Your Job Title"
searchBar.fitToSize()
searchBar.delegate = self //do not need if you delegate searchBar
let viewForSearchBar: UIView = UIView(frame: searchBar.bounds)
viewForSearchBar.addSubview(searchBar)
self.navigationItem.titleView = viewForSearchBar

********* But There is another way to set cancel button correctly and fit for the view :-

  1. Set search bar as the Navigation bar title view :-

    let searchBar: UISearchBar = UISearchBar()
    searchBar.showCancelButton = true
    searchBar.placeholder = "Search Your Job Title"
    searchBar.delegate = self //do not need if you delegate searchBar
    self.navigationItem.titleView = searchBar
    
  2. Drag and drop Bar button to the right side of the view controller & name it as Cancel.

  3. Then connect that button to this function :-

    @IBAction func iPadCancelButton(sender: AnyObject) {
           UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)
          self.dismissViewControllerAnimated(true, completion: nil)
    }
    

As per apple documentation setShowsCancelButton

Cancel buttons are not displayed for apps running on iPad, even when you specify YES for the showsCancelButton parameter.

I am not sure about the alternate but this is what apple provides us.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!