tutorial searchcontroller example custom bar ios ios8 uisearchbar uisearchcontroller

ios - searchcontroller - uisearchbar swift 4



Cambiar el texto del botón de cancelación de UISearchBar en iOS 8 (12)

¡Lo encontré!. en iOS 8, el botón de cancelar está debajo de la tecla "cancelButton". Usé el delegado de UISearchBar searchBarTextDidBeginEditing para hacer el cambio.

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

Me gustaría cambiar el texto de "Cancelar" a "Hecho" del botón Cancelar dentro de la barra UISearch en iOS 8. Estoy usando UISearchController. He intentado diferentes enfoques para iOS 6 y iOS 7 y no funcionan. ¿Alguien ha hecho esto?


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 } } }


En Swift4

Cambiar Título:

(searchBar.value(forKey: "cancelButton") as! UIButton).setTitle("Done", for: .normal)

Cambiar el color:

(searchBar.value(forKey: "cancelButton") as! UIButton).setTitleColor(UIColor.blue, for: .normal)


En Swift:

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

Basado en la respuesta de Burhanuddin Sunelwala.


Estaba teniendo problemas para hacer que esto funcionara para una UISearchBar dentro de un UISearchController. El texto no cambió la primera vez que se mostró el botón de cancelar, pero sí la segunda vez.

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

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


Esto funcionara

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

Versión rápida:

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


Esto me funcionó en ios8, no lo intenté en ios7, pero debería hacer el truco, tenga cuidado de colocar esta línea en los primeros tiempos del ciclo de la aplicación (por ejemplo: appDelegate)

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

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

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

Versión rápida:

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

Espero que ayude ;)


He añadido titleLabel.font a la mezcla ...

Esto va directo 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


Sé que esto puede parecer un poco irrelevante, pero en mi opinión 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 desea que Apple siga su mecanismo en toda la aplicación. Básicamente, mi idea es cambiar el idioma que usa el SDK de iOS para localizar el botón modificando la clave "AppleLanguages" en el NSUserDefaults. Puede ir here para obtener 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 utilizar la localización en inglés y un respaldo en francés sin importar qué idioma esté configurado en el teléfono. Esto solo tiene efecto dentro de la aplicación.


Swift 3.0:

En tu AppDelegate agrega esto:

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


Swift 4.2, 4.0+

Una clase personalizada para personalizar los elementos más comunes en la barra de búsqueda.

class SearchBar: UISearchBar { private enum SubviewKey: String { case searchField, clearButton, cancelButton, placeholderLabel } // Button/Icon images public var clearButtonImage: UIImage? public var resultsButtonImage: UIImage? public var searchImage: UIImage? // Button/Icon colors public var searchIconColor: UIColor? public var clearButtonColor: UIColor? public var cancelButtonColor: UIColor? public var capabilityButtonColor: UIColor? // Text public var textColor: UIColor? public var placeholderColor: UIColor? public var cancelTitle: String? // Cancel button to change the appearance. public var cancelButton: UIButton? { guard showsCancelButton else { return nil } return self.value(forKey: SubviewKey.cancelButton.rawValue) as? UIButton } override func layoutSubviews() { super.layoutSubviews() if let cancelColor = cancelButtonColor { self.cancelButton?.setTitleColor(cancelColor, for: .normal) } if let cancelTitle = cancelTitle { self.cancelButton?.setTitle(cancelTitle, for: .normal) } guard let textField = self.value(forKey: SubviewKey.searchField.rawValue) as? UITextField else { return } if let clearButton = textField.value(forKey: SubviewKey.clearButton.rawValue) as? UIButton { update(button: clearButton, image: clearButtonImage, color: clearButtonColor) } if let resultsButton = textField.rightView as? UIButton { update(button: resultsButton, image: resultsButtonImage, color: capabilityButtonColor) } if let searchView = textField.leftView as? UIImageView { searchView.image = (searchImage ?? searchView.image)?.withRenderingMode(.alwaysTemplate) guard let color = searchIconColor else { return } searchView.tintColor = color } if let placeholderLabel = textField.value(forKey: SubviewKey.placeholderLabel.rawValue) as? UILabel, let color = placeholderColor { placeholderLabel.textColor = color } if let textColor = textColor { textField.textColor = textColor } } private func update(button: UIButton, image: UIImage?, color: UIColor?) { let image = (image ?? button.currentImage)?.withRenderingMode(.alwaysTemplate) button.setImage(image, for: .normal) button.setImage(image, for: .highlighted) if let color = color { button.tintColor = color } } }

Uso:

class ViewController: UIViewController { @IBOutlet private weak var searchBar: SearchBar! override func viewDidLoad() { super.viewDidLoad() searchBar.clearButtonColor = .purple searchBar.cancelButtonColor = .magenta searchBar.searchIconColor = .red searchBar.placeholderColor = .green searchBar.textColor = .orange searchBar.capabilityButtonColor = .green } }

Resultado:


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 subvistas contienen UISearchBarBackground, UISearchBarTextField, UINavigationButto‌ n en las que UINavigationButton es subclase de UIButton.Check para Ver como UIButton y si es así, cambie la propiedad de UIButton.