簡體   English   中英

iOS更改UISearchBar中取消按鈕的標題

[英]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;
            }
        }];

如果您只想將“取消”文本更改為您的語言環境中的相同,我認為正確的方法是使用本地化。 方法如下:

  1. 在Finder中打開您的項目,找到en.lproj目錄
  2. 將其重命名為您的語言環境,或者如果您必須支持多種語言則將其復制
  3. 刪除它可能包含在Xcode中的任何文件引用(它們應該看起來是紅色的)
  4. 將Finder中的相同文件從新目錄拖到Xcode
  5. (不確定這是否必要)編輯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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM