24

I have UICollectionView. On clicking search button in UINavigationBar, I am adding the UISearchController's searchbar as titleview for UINavigationItem. For iPhone it is working properly. For iPad the cancel button is not shown. The Searchbar alone takes the entire width.

enter image description here

Can anyone help me out on this?. Thanks in advance.

Sheik_101
  • 770
  • 1
  • 8
  • 24
  • Are you using different storyboards or xib for iPhone and iPad? – Nirav Gadhiya May 27 '15 at 06:17
  • No. I am not using storyboards or xib. – Sheik_101 May 27 '15 at 06:18
  • Try to set `searchBar.showsCancelButton = YES;` – Nirav Gadhiya May 27 '15 at 06:20
  • possible duplicate of [iOS7 when UIsearchbar added in UINavigationBar not showing cancel button](http://stackoverflow.com/questions/18986407/ios7-when-uisearchbar-added-in-uinavigationbar-not-showing-cancel-button) – Nirav Gadhiya May 27 '15 at 06:27
  • 3
    The documentation clearly states: "The value of this property is ignored, and no cancel button is displayed, for apps running on iPad". I don't think this is appropriate, especially for slide over / split view scenarios. So I filed a radar: http://openradar.appspot.com/37498710 – Ortwin Gentz Feb 13 '18 at 16:33

7 Answers7

18

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;
Nikita Khandelwal
  • 1,741
  • 16
  • 25
  • 2
    Good pick from : http://stackoverflow.com/questions/18986407/ios7-when-uisearchbar-added-in-uinavigationbar-not-showing-cancel-button – Nirav Gadhiya May 27 '15 at 06:26
8

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.

William Denniss
  • 16,089
  • 7
  • 81
  • 124
Tal Haham
  • 1,500
  • 12
  • 16
  • This seems like the correct answer to me. The cancel button isn't supported on iPad, so just add it manually as a `UIBarButtonItem`. – William Denniss May 03 '16 at 03:24
5
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)
        }
    }
Sagar Daundkar
  • 320
  • 3
  • 13
4

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.

enter image description here

2

Try this. Add a checkmark for shows cancel button.

enter image description here

Kaey
  • 4,615
  • 1
  • 14
  • 18
1

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)
    }
    
Mudith Chathuranga Silva
  • 7,253
  • 2
  • 50
  • 58
0

For iOS 13 built with Xcode 11, I'm needing to set manually set the display value on the cancel button, depending on whether the search controller is visible

Nostradamus
  • 1,497
  • 3
  • 20
  • 34