Подтвердить что ты не робот

Изменение текста кнопки отмены UISearchBar в iOS 8

Я хотел бы изменить текст из ¨Cancel¨to ¨Done¨ кнопки Отмена внутри UISearchBar в iOS 8. Я использую UISearchController. Я пробовал разные подходы для iOS 6 и iOS 7, и они не работают. Кто-нибудь сделал это?

4b9b3361

Ответ 1

Objective-C:

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

Swift:

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

Ответ 2

Это сработало для меня в ios8, не пробовал в ios7, но должно сработать, остерегайтесь размещения этой строки в ранние времена цикла приложения (например, appDelegate)

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

и с ios9 вы также можете использовать

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

Swift версия:

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

Надеюсь, это поможет ;)

Ответ 3

Нашел!. в iOS 8 кнопка отмены находится под клавишей "cancelButton". Я использовал делегат UISearchBar searchBarTextDidBeginEditing, чтобы внести изменения.

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

}

Ответ 4

Swift 3.0:

В AppDelegate добавьте следующее:

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

Ответ 5

 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]). subviews содержат UISearchBarBackground, UISearchBarTextField, UINavigationButto n, в котором UINavigationButton является подклассом UIButton.Check для View как UIButton, и если да, то измените свойство UIButton.

Ответ 6

В Swift:

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

На основании ответа Бурхануддина Сансельвалы.

Ответ 7

У меня были проблемы с тем, чтобы заставить это работать для UISearchBar в UISearchController. Текст не изменился в первый раз, когда была показана кнопка отмены, но изменился во второй раз.

Пока я не увидел ответ @polo987. Вот что я сделал, чтобы сработало:

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

Ответ 8

В Swift4

Изменить название:

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

Изменить цвет:

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

Ответ 9

Я добавил titleLabel.font в микс...

Это происходит прямо в моей 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

Ответ 10

Swift 4.2, 4. 0+

Пользовательский класс для настройки наиболее распространенных элементов в панели поиска.

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

Использование:

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

Результат: enter image description here

Ответ 11

Я знаю, что это может показаться немного неактуальным, но, на мой взгляд, это безопаснее, чем использование частной apis и более эффективно, чем погружение в неизвестные представления. Это решение имеет смысл только в том случае, если у вас есть собственный механизм локализации, и вы хотите, чтобы Apple следила за вашим механизмом по всему приложению. В принципе, моя идея - переключить язык, используемый IOS SDK, чтобы локализовать кнопку, изменив ключ "AppleLanguages" в NSUserDefaults. Вы можете пойти здесь для получения дополнительной информации о том, как это работает.

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

Поместите этот код, чтобы использовать английскую локализацию и французский резерв, независимо от того, какой язык установлен на телефоне. Это действует только в приложении.

Ответ 12

Вот решение 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
        }
    }
}

Ответ 13

Для поддержки iOS 13:

Swift:

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

Цель C:

    [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:[NSArray arrayWithObject:[UISearchBar class]]] setTitle:@"Whatever"]