[英]iOS Change the title of cancel button in UISearchBar
我希望在iOS中更改取消按鈕的標題。 我之前一直在用這個:
- (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。 有什么建議?
您需要遞歸搜索按鈕。 這應該是一種自動防故障的方法:
- (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上測試了這個,但它也適用於iOS 6也應該這樣做。
只需為它執行此代碼: -
- (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中測試,但在iOS6中這種工作正常,希望這對你有用。
輸出是: -
這是我對ios6和ios7的解決方案
#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上運行,您必須在搜索欄的子視圖中搜索:
//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];
}
}
對於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)
這是輸出
把這一行放在appDelegate中
[[UIButton appearanceWhenContainedIn:[UISearchBar class],nil] setTitle:@“Your Title”forState:UIControlStateNormal];
@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];
}
}
}
在搜索開始之前,在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;
}
}];
如果您只想將“取消”文本更改為您的語言環境中的相同,我認為正確的方法是使用本地化。 方法如下:
en.lproj
目錄 (不確定這是否必要)編輯Info.plist
並添加以下行:
Localization native development region
:您的區域(例如: en
) Localizations
:例如English
注意:它在Simulator中不起作用,在設備上測試!
(來源: 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解決方案,我使用了這段代碼並且完美無缺! 只需在app啟動時調用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
協議方法中使用的代碼進行UIKitUISearchResultsUpdating
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.