web-dev-qa-db-fra.com

Modifier le texte du bouton Annuler UISearchBar dans iOS 8

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?

35
Wilmer

Objectif-C:

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

Swift:

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

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é ;)

25
polo987

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)

}
16
Wilmer

Swift 3.0:

Dans votre AppDelegate ajoutez ceci:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "my text"
13
Maysam
 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.

10
Donal

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"
5
toddg

Dans Swift:

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

Basé sur la réponse de Burhanuddin Sunelwala.

5
Aleksejs Mjaliks

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)

5
Akhil Clement

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
3
David West

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

Résultat: enter image description here

2
Kamran

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.

2
Exception

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