Cambiar el text del button de cancelación UISearchBar en iOS 8

Me gustaría cambiar el text de "Cancelar" a "Hecho" del button Cancelar dentro de UISearchBar en iOS 8. Estoy usando UISearchController. He intentado diferentes enfoques para iOS 6 y iOS 7 y no funcionan. ¿Alguien ha hecho esto?

Esto funcionara

[searchBar setValue:@"customString" forKey:@"_cancelButtonText"]; 

Versión Swift:

 searchBar.setValue("customString", forKey:"_cancelButtonText") 

¡Lo encontré!. en iOS 8, el button de cancelar está debajo de la tecla "cancelarButton". Usé UISearchBar delegate searchBarTextDidBeginEditing para hacer el cambio.

 func searchBarTextDidBeginEditing(searchBar: UISearchBar) { let uiButton = searchBar.valueForKey("cancelButton") as UIButton uiButton.setTitle("Done", forState: UIControlState.Normal) } 

Esto funcionó para mí en ios8, no intenté en ios7, pero debería hacer el truco, tenga cuidado de ubicar esta línea en los primeros times del ciclo de la aplicación (por ejemplo, appDelegate)

 [[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@"Annuler"]; 

y a partir de ios9 también podría usar

 [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitle:@"Annuler"]; 

Espero que ayude 😉

  for view in (UISearchBar.subviews[0]).subviews{ if let button = view as? UIButton{ button.setTitleColor(UIColor.whiteColor(), forState: .Normal) button.setTitle("Cancel", forState:.Normal) } } 

self.subviews [0]). Las subvenciones contienen UISearchBarBackground, UISearchBarTextField, UINavigationButto n en el que UINavigationButton es la subclass de UIButton.Check para Ver como UIButton y, si es así, cambie la propiedad de UIButton.

En Swift:

 searchBar.setValue("customString", forKey: "_cancelButtonText") 

Basado en la respuesta de Burhanuddin Sunelwala.

Swift 3.0:

En su AppDelegate agregue esto:

 UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "my text" 

He agregado titleLabel.font a la mezcla …

Esto va directamente a mi ViewDidLoad () {

  let searchFont = UIFont(name: "BrandonGrotesque-Medium", size: 12) let textFieldSearchBar = self.searchBar.valueForKey("searchField") as! UITextField textFieldSearchBar.font = searchFont let cancelButton = searchBar.valueForKey("cancelButton") as! UIButton cancelButton.setTitle("Done", forState: .Normal) cancelButton.titleLabel!.font = searchFont 

Estaba teniendo problemas para que esto funcione para un UISearchBar dentro de un UISearchController. El text no cambió la primera vez que se mostró el button de cancelar, pero lo hizo por segunda vez.

Eso fue hasta que vi la respuesta de @ polo987. Esto es lo que hice que funcionó:

 UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).title = "Done" 

Sé que esto puede parecer un poco irrelevante, pero en mi opinión, esto es más seguro que usar apis privados y más eficiente que sumergirse en las vistas desconocidas. Esta solución solo tiene sentido si tiene su propio motor de localización y si desea que Apple siga su mecanismo en toda la aplicación. Básicamente, mi idea es cambiar el idioma que utiliza el iOS SDK para localizar el button al modificar la key "AppleLanguages" en NSUserDefaults. Puede ir aquí para get más información sobre cómo funciona esto.

 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"fr", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

Ponga este código para usar la localización en inglés y un respaldo francés, sin importar el idioma que se establezca en el teléfono. Esto solo tiene efecto dentro de la aplicación.

Aquí está la solución Swift:

 for (view) in _searchController.searchBar.subviews { for (subview) in view.subviews { if (subview.isKindOfClass(UIButton.self)) { let cancelButton = subview as! UIButton cancelButton.setTitle("BlaBla", forState: .Normal) break } } }