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; } }];
如果您只是想在您的语言环境中将“取消”文本更改为相同,则我认为正确的方式是使用本地化。 这里是如何:
- 在Finder中打开项目,find
en.lproj
目录 - 将其重命名为您的语言环境,或者如果您必须支持多种语言,请将其复制
- 删除Xcode中可能包含的任何文件引用(它们应该看起来是红色的)
- 将Finder中的相同文件从新目录拖到Xcode
-
(不知道这是必要的)编辑你的
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)