iOS7 quando UIsearchbar aggiunto in UINavigationBar non mostra il pulsante Annulla

Aggiungo UISearchBar sopra UINavigationBar e set UIsearchbar showsCancelButton YES, funziona bene su iOS6 ma in iOS7 non mostra il pulsante cancel. Ho usato sotto lo snippet di codice

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 600, 44)]; searchBar.showsCancelButton = YES; searchBar.translucent = NO; [searchBar setTintColor:[UIColor redColor]]; searchBar.backgroundColor = [UIColor yellowColor]; [self.navigationController.navigationBar addSubview:searchBar]; 

Per qualche ragione, iOS7 non mostra il pulsante Annulla quando viene aggiunto a una barra di navigazione. Questo succede anche se provi ad impostarlo come titleView di un object NavigationItem.

È ansible aggirare questo problema avvolgendo prima UISearchBar in un altro UIView. Ecco come lo faccio come titleView:

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

Ho avuto un problema simile, nella barra di ricerca di iPhone con il pulsante di annullamento mostra bene, ma su iPad il pulsante Annulla non è stato mostrato. Avvolgere la UIsearchBar in UIView come @Rodskjegg genera problemi di stile. Su iPad UIsearchBar impostandolo come titleView di un object NavigationItem e aggiungi UIBarButtonItem su setRighttBarButtonItem come UIBarButtonSystemItemCancel.

  [self.navigationItem setLeftBarButtonItem:Nil animated:YES]; self.navigationItem.titleView = self.searchBar; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(searchBarCancelButtonClicked:)]; [self.navigationItem setRightBarButtonItem: cancelButton animated:YES]; } else { [self.navigationItem setRightBarButtonItem: nil animated:YES]; } 

Sì Nel pulsante di iOS 7 si trova sullo schermo, ma il titolo potrebbe essere invisibile La mia soluzione era impostare lo stile di ricerca su “Minimo” e scegliere il colore della tinta della barra per il colore del testo “Annulla” in IB

inserisci la descrizione dell'immagine qui

E il risultato in un simulatore:

inserisci la descrizione dell'immagine qui

Da iOS 7 puoi semplicemente impostare la proprietà displaysSearchBarInNavigationBar su YES su UISearchDisplayController per ottenere automaticamente UISearchbar nella NavigationBar.

Ho incontrato lo stesso problema, ecco la mia soluzione, spero che questo aiuti.

Qualche ulteriore spiegazione: ho scoperto che l’invio di setShowsCancelButton:animated: alla searchBar, funziona come per magia. E il modo più pulito per aggiungere una barra di ricerca alla barra di navigazione è self.navigationItem.titleView = self.searchBar; La tempistica appropriata per chiamare setShowsCancelButton:animated: is in searchBarTextDidBeginEditing: e searchBarTextDidEndEditing: metodi delegate, quindi ricorda di impostare self per essere il delegato di searchBar.

 - (void)viewDidLoad { self.navigationItem.titleView = self.searchBar; } - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { [searchBar setShowsCancelButton:YES animated:YES]; } - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar { [searchBar setShowsCancelButton:NO animated:YES]; } 

Ho avuto lo stesso problema, su iPhone l’annullamento della ricerca è stato mostrato bene, ma su iPad no.

La soluzione alternativa per avvolgere UISearchBar in un altro UIView non ha funzionato bene poiché aveva un aspetto diverso e una larghezza errata alla rotazione.

La mia soluzione è semplice: usa la ricerca WITHOUT cancel e aggiungi cancel come UIBarButtonItem.

Implementa il delegato della barra di ricerca e utilizza questo:

 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { searchBar.showsCancelButton = YES; }