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