iOS更改UISearchBar中取消button的标题

我希望更改iOS中取消button的标题。 我以前一直在使用这个:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{ self.searchDisplayController.searchBar.showsCancelButton = YES; UIButton *cancelButton = nil; for (UIView *subView in self.searchDisplayController.searchBar.subviews) { if ([subView isKindOfClass:NSClassFromString(@"UIButton")]) { cancelButton = (UIButton*)subView; } } [cancelButton setTitle:@"Annuller" forState:UIControlStateNormal]; } 

但它似乎不适用于iOS7。 有什么build议么?

简单地做这个代码: –

 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { /* when user start editing in serchbar this method will display cancel button and disable the autocorrection functionality */ srcbar.showsCancelButton = YES; for (UIView *subView in searchBar.subviews) { if ([subView isKindOfClass:[UIButton class]]) { UIButton *cancelButton = (UIButton*)subView; [cancelButton setTitle:@"hi" forState:UIControlStateNormal]; } } srcbar.autocorrectionType = UITextAutocorrectionTypeNo; } 

不在iOS7中testing,但在iOS6的这个工作正常,希望这为你工作。

产量是: –

在这里输入图像说明

您需要recursionsearchbutton。 这应该是一个安全的方式来做到这一点:

 - (void)viewDidLoad { [super viewDidLoad]; [self convertButtonTitle:@"Cancel" toTitle:@"Annuller" inView:self.searchBar]; } - (void)convertButtonTitle:(NSString *)from toTitle:(NSString *)to inView:(UIView *)view { if ([view isKindOfClass:[UIButton class]]) { UIButton *button = (UIButton *)view; if ([[button titleForState:UIControlStateNormal] isEqualToString:from]) { [button setTitle:to forState:UIControlStateNormal]; } } for (UIView *subview in view.subviews) { [self convertButtonTitle:from toTitle:to inView:subview]; } } 

我已经在iOS 7上testing了这个,但它的工作原理,也应该这样做的iOS 6。

这里是我对ios6和ios7的解决scheme

 #define IS_IOS7 (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { self.searchDisplayController.searchBar.showsCancelButton = YES; UISearchBar *searchBar = self.searchDisplayController.searchBar; UIView *viewTop = IS_IOS7 ? searchBar.subviews[0] : searchBar; NSString *classString = IS_IOS7 ? @"UINavigationButton" : @"UIButton"; for (UIView *subView in viewTop.subviews) { if ([subView isKindOfClass:NSClassFromString(classString)]) { UIButton *cancelButton = (UIButton*)subView; [cancelButton setTitle:@"your title" forState:UIControlStateNormal]; } } } 

为了使它在iOS7上工作,你必须在search栏的子视图中search:

 //iOS 7 hack searchBar.showsCancelButton = YES; UIView* view=searchBar.subviews[0]; for (UIView *subView in view.subviews) { if ([subView isKindOfClass:[UIButton class]]) { UIButton *cancelButton = (UIButton*)subView; [cancelButton setTitle:@"Anuluj" forState:UIControlStateNormal]; } } 

把这一行放在appDelegate中

[UIButton appearanceWhenContainedIn:[UISearchBar class],nil] setTitle:@“Your Title”forState:UIControlStateNormal];

对于Swift 3.0

这工作正常。

 func setSearchButtonText(text:String,searchBar:UISearchBar) { for subview in searchBar.subviews { for innerSubViews in subview.subviews { if let cancelButton = innerSubViews as? UIButton { cancelButton.setTitleColor(UIColor.white, for: .normal) cancelButton.setTitle(text, for: .normal) } } } } 

并调用该方法

 setSearchButtonText(text: "Done", searchBar: yourSearchBar) 

这是输出

在这里输入图像说明

@Nitin Gohel像这样?

 - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{ self.searchDisplayController.searchBar.showsCancelButton = YES; UIButton *cancelButton = nil; for (UIView *subView in self.searchDisplayController.searchBar.subviews) { if ([subView isKindOfClass:NSClassFromString(@"UIButton")]) { cancelButton = (UIButton*)subView; [cancelButton setTitle:@"Annuller" forState:UIControlStateNormal]; } } } 

看起来像“self.searchDisplayController.searchBar.subviews”只是返回“searchBar”本身。 我试过了,它起作用了!

 for (UIView *searBarView in [self.searchDisplayController.searchBar subviews]) { for (UIView *subView in [searBarView subviews]) { if ([subView isKindOfClass:[UIButton class]]) { UIButton *cancleButton = (UIButton *)subView; [cancleButton setTitle:@"hi" forState:UIControlStateNormal]; } } } 

在开始search之前,在UISearchBarDelagate或者UISearchDisplayControllerDelegate中做:

 [self.searchDisplayController.searchBar.subviews enumerateObjectsUsingBlock:^(UIButton *subview, NSUInteger idx, BOOL *stop) { if ([subview isKindOfClass:[UIButton class]]) { [subview setTitle:@"OK" forState:UIControlStateNormal]; *stop = YES; } }]; 

如果您只是想在您的语言环境中将“取消”文本更改为相同,则我认为正确的方式是使用本地化。 这里是如何:

  1. 在Finder中打开项目,finden.lproj目录
  2. 将其重命名为您的语言环境,或者如果您必须支持多种语言,请将其复制
  3. 删除Xcode中可能包含的任何文件引用(它们应该看起来是红色的)
  4. 将Finder中的相同文件从新目录拖到Xcode
  5. (不知道这是必要的)编辑你的Info.plist并添加这些行:

    • Localization native development region :您所在的地区(例如: en
    • Localizations :例如English

注意:它不能在模拟器中工作,请在设备上进行testing!

(来源: http : //www.ibabbleon.com/iphone_app_localization.html )

对于iOS7,这个工作。

 -(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{ self.searchDisplayController.searchBar.showsCancelButton = YES; UIButton *cancelButton; UIView *topView = self.searchDisplayController.searchBar.subviews[0]; for (UIView *subView in topView.subviews) { if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) { cancelButton = (UIButton*)subView; } } if (cancelButton) { //Set the new title of the cancel button [cancelButton setTitle:@"YourTitle" forState:UIControlStateNormal]; } } 

参考上面的@Salih的解决scheme,我使用这个代码,工作完美! 只需在应用程序启动时调用AppDelegate.m中的setupAppearance方法即可。

 - (void)setupAppearance { id appearance = nil; if (IOS9_OR_LATER) { appearance = [UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]; } else { appearance = [UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil]; } [appearance setTitle:@"CANCEL"]; } 

用我在UIKitUISearchResultsUpdating协议方法updateSearchResults(for searchController: UISearchController)中使用的代码updateSearchResults(for searchController: UISearchController)

 if let cancelButton : UIButton = searchController.searchBar.value(forKey: "_cancelButton") as? UIButton { cancelButton.setTitle("Back", for: UIControlState.normal) } 

(iOS 10,Swift 3.0)