Je voudrais changer le texte de ¨Annuler¨ à ¨Done¨ du bouton Annuler à l'intérieur de l'UISearchBar dans iOS 8. J'utilise UISearchController. J'ai essayé différentes approches pour iOS 6 et iOS 7 et elles ne fonctionnent pas. Quelqu'un a-t-il fait cela?
Objectif-C:
[searchBar setValue:@"customString" forKey:@"_cancelButtonText"];
Swift:
searchBar.setValue("customString", forKey:"_cancelButtonText")
Cela a fonctionné pour moi dans ios8, n'a pas essayé dans ios7, mais devrait faire l'affaire, méfiez-vous de placer cette ligne dans les premiers temps du cycle d'application (par exemple: appDelegate)
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@"Annuler"];
et à partir d'ios9, vous pouvez également utiliser
[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitle:@"Annuler"];
Version Swift:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Annuler"
J'espère que ça t'as aidé ;)
Je l'ai trouvé !. dans iOS 8, le bouton d'annulation se trouve sous la touche "cancelButton". J'ai utilisé le délégué UISearchBar searchBarTextDidBeginEditing pour effectuer le changement.
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
let uiButton = searchBar.valueForKey("cancelButton") as UIButton
uiButton.setTitle("Done", forState: UIControlState.Normal)
}
Swift 3.0:
Dans votre AppDelegate ajoutez ceci:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "my text"
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]). les sous-vues contiennent UISearchBarBackground, UISearchBarTextField, UINavigationButto n dans laquelle UINavigationButton est une sous-classe de UIButton.Vérifiez View as UIButton et si oui, changez la propriété de UIButton.
J'avais du mal à faire fonctionner cela pour un UISearchBar dans un UISearchController. Le texte n'a pas changé la première fois que le bouton d'annulation a été affiché, mais il l'a fait la deuxième fois.
C'est jusqu'à ce que je voie la réponse de @ polo987. Voici ce que j'ai fait qui a fonctionné:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Done"
Dans Swift:
searchBar.setValue("customString", forKey: "_cancelButtonText")
Basé sur la réponse de Burhanuddin Sunelwala.
Dans Swift4
Modifier le titre:
(searchBar.value(forKey: "cancelButton") as! UIButton).setTitle("Done", for: .normal)
Changer la couleur:
(searchBar.value(forKey: "cancelButton") as! UIButton).setTitleColor(UIColor.blue, for: .normal)
J'ai ajouté titleLabel.font au mix ...
Cela va directement dans mon 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
Rapide 4.2, 4.0 +
Une classe personnalisée pour personnaliser les éléments les plus courants dans la barre de recherche.
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)
if let color = searchIconColor {
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
}
}
}
Utilisation:
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
}
}
Je sais que cela peut sembler un peu hors de propos, mais à mon avis, c'est plus sûr que d'utiliser des API privées et plus efficace que de plonger dans des vues inconnues. Cette solution n'a de sens que si vous avez votre propre moteur de localisation et que vous voulez Apple suivre votre mécanisme partout dans l'application. Fondamentalement, mon idée est de changer la langue utilisée par le SDK iOS pour localiser le en modifiant la clé "AppleLanguages" dans NSUserDefaults. Vous pouvez aller ici pour plus d'informations sur la façon dont cela fonctionne.
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
Mettez ce code pour utiliser la localisation en anglais et une solution de rechange en français, quelle que soit la langue définie sur le téléphone. Cela ne prend effet qu'au sein de l'application.
Voici la solution 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
}
}
}