2015-03-11 3 views
24

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

+0

возможно дубликат [UISearchController изменения 'Отмена' Название кнопки] (http://stackoverflow.com/questions/28642807/uisearchcontroller-change-cancel-button -title) –

+0

Я написал ответ на эту тему здесь: http://stackoverflow.com/questions/19206757/how-to-change-textcolor-of-cancel-button-of-uisearchbar-in-ios7. Просто используйте SHSearchBar Cocoapod, который не является такой болью в заднице, как UISearchBar. – blackjacx

ответ

13

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

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

} 
+4

Я бы предпочел не устанавливать заголовок кнопки внутри этого обратного вызова. Кажется немного странным и ненужным. Подумайте о настройке этого значения при настройке вашего представления. –

+1

В 100 раз лучше, чем использовать private '_cancelButtonText' – Leo

+0

@ SteffenD.Sommer Мне было удобно установить его внутри обратного вызова, потому что я не показываю кнопку «Отмена», пока UISearchBar не будет в фокусе. – toddg

65

Это будет работать

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

Swift Версия:

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

У вас есть версия Swift? –

+0

@It_Does_Not_Matter Обновлено! –

+1

Должен быть принят андерсером. – Allen

5

В Swift:

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

на основе Бархануддин Sunelwala ответа.

+0

Лучшее решение, спасибо – Jack

0

Вот Свифт решение:

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

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

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

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

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

Надежда, что помогает;)

+0

Подтверждено, что работает iOS 11. – mxcl

3

Я добавил 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 
+0

Восток или Запад ... David BEST:) .... спасибо Buddy –

4

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

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

UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).title = "Done" 
2

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

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

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

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

+0

Пожалуйста, объясните, как работает этот код. –

+0

Пожалуйста, используйте ссылку [edit], чтобы добавить эту информацию в свой пост. Комментарии являются «гражданами второго сорта» и могут быть удалены в любое время. –

+0

Этот ответ почти сработал для меня - я поместил код в 'searchBarTextDidBeginEditing', и он правильно изменил заголовок кнопки. Это не сработало в первый раз, когда отображается кнопка «Отмена» - я подозреваю, что она создается через несколько минут, чем вызов для 'searchBarTextDidBeginEditing'. Я закончил использовать [это решение] (http://stackoverflow.com/a/40257292/1540248) в моем методе 'viewDidLoad' - работает как шарм! – MayaLekova

7

Swift 3,0:

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

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

В Swift4

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

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

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

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

Смежные вопросы