Подтвердить что ты не робот

Как изменить текст по умолчанию кнопки "Отмена", который появляется в UISearchBar + iPhone

HI Я разрабатываю приложение, где я хотел изменить текст строки поиска в SearchBar. Я хотел изменить текст кнопки "Отмена", которая появляется рядом с SearchBar. Прежде чем вводить любую строку в строке поиска, мы получим строку поиска как строку по умолчанию. я хотел изменить текст этой строки, и когда мы нажимаем на эту панель поиска, мы получаем кнопку отмены рядом с поисковой панелью, и я хочу изменить текст этой кнопки отмены. PLease помогите мне.

4b9b3361

Ответ 1

Перед процедурой также необходимо иметь "searchBar setShowsCancelButton".

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    [theSearchBar setShowsCancelButton:YES animated:NO];
    for (UIView *subView in theSearchBar.subviews){
        if([subView isKindOfClass:[UIButton class]]){
            [(UIButton*)subView setTitle:@"Done" forState:UIControlStateNormal];
        }
    }
}

Обратите внимание: используйте UIButton, чтобы избежать проблем с Apple!

Ответ 2

Использовать прокси-сервер вида:

id barButtonAppearanceInSearchBar = [UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil];

[barButtonAppearanceInSearchBar setBackgroundImage:grayBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[barButtonAppearanceInSearchBar setTitleTextAttributes:@{
                                      NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:20],
                                 NSForegroundColorAttributeName : [UIColor blackColor]
     } forState:UIControlStateNormal];
[barButtonAppearanceInSearchBar setTitle:@"X"];

Ответ 3

Решение для iOS 7. Все кредиты для этого перейдите на Mr. Jesper Nielsen - он написал код.

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    UIButton *cancelButton;
    UIView *topView = theSearchBar.subviews[0];
    for (UIView *subView in topView.subviews) {
        if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            cancelButton = (UIButton*)subView;
        }
    }
    if (cancelButton) {
        [cancelButton setTitle:@"YourTitle" forState:UIControlStateNormal];
    }

}

Ответ 4

Если по строке "Поиск строки" вы имеете в виду местозаполнитель, то это должно сделать это:

[searchBar setPlaceholder:@"Whatever you want"];

Что касается изменения текста кнопки отмены, это может быть немного сложнее. Apple не использует стандартный UIBarButtonItem для этого или даже нестандартный UIButton. Вместо этого они используют кнопку UINavigationButton для кнопки "Отмена" в строке поиска. Поскольку это не документированный публичный класс, попытка его изменения может очень хорошо отменить ваше приложение из App Store. Если вы хотите подвергнуть риску отклонение, вы можете выполнить поиск в подзаголовках searchBar:

for(UIView *view in [searchBar subviews]) {
    if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) {
        [(UIBarItem *)view setTitle:@"Whatever you want"];
    }
}

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

Ответ 5

В iOS 7, если вы используете UISearchBar, просто напишите этот код в searchBarTextDidBeginEditing: method

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:@"إلغاء" forState:UIControlStateNormal];
       }
}

Ответ 6

Я хотел бы исправить технику UIAppearance, так как код yar1vn не будет работать с Xcode 5. При этом вы будете иметь код, который отлично работает как для iOS 6, так и для iOS 7.

Во-первых, вам нужно понять, что кнопка отмены является частной UINavigationButton: UIButton. Следовательно, это не UIBarButtonItem. После некоторого осмотра кажется, что UINavigationButton будет отвечать на эти селекторы UIAppearance:

// inherited from UINavigationButton
@selector(setTintColor:)
@selector(setBackgroundImage:forState:style:barMetrics:)
@selector(setBackgroundImage:forState:barMetrics:)
@selector(setTitleTextAttributes:forState:)
@selector(setBackgroundVerticalPositionAdjustment:forBarMetrics:)
@selector(setTitlePositionAdjustment:forBarMetrics:)
@selector(setBackButtonBackgroundImage:forState:barMetrics:)
@selector(setBackButtonTitlePositionAdjustment:forBarMetrics:)
@selector(setBackButtonBackgroundVerticalPositionAdjustment:forBarMetrics:)

// inherited from UIButton
@selector(setTitle:forState:)

Кстати, эти селекторы соответствуют параметрам UIBarButtonItem. Значение заключается в том, чтобы использовать два отдельных UIAppearance для обработки частного класса UINavigationButton.

/* dual appearance technique by Cœur to customize a UINavigationButton */
Class barClass = [UISearchBar self];

UIBarButtonItem<UIAppearance> *barButtonItemAppearanceInBar = [UIBarButtonItem appearanceWhenContainedIn:barClass, nil];
[barButtonItemAppearanceInBar setTintColor:...];
[barButtonItemAppearanceInBar setBackgroundImage:... forState:... style:... barMetrics:...];
[barButtonItemAppearanceInBar setBackgroundImage:... forState:... barMetrics:...];
[barButtonItemAppearanceInBar setTitleTextAttributes:... forState:...];
[barButtonItemAppearanceInBar setBackgroundVerticalPositionAdjustment:... forBarMetrics:...];
[barButtonItemAppearanceInBar setTitlePositionAdjustment:... forBarMetrics:...];
[barButtonItemAppearanceInBar setBackButtonBackgroundImage:... forState:... barMetrics:...];
[barButtonItemAppearanceInBar setBackButtonTitlePositionAdjustment:... forBarMetrics:...];
[barButtonItemAppearanceInBar setBackButtonBackgroundVerticalPositionAdjustment:... forBarMetrics:...];

UIButton<UIAppearance> *buttonAppearanceInBar = [UIButton appearanceWhenContainedIn:barClass, nil];
[buttonAppearanceInBar setTitle:... forState:...];

Теперь этот метод работает для кнопки "Отмена", но он также работает для кнопки "Назад", если вы измените barClass на [UINavigationBar self].

Ответ 7

Это решение работает для меня - iOs7 и iOs8:

@interface ... : ...
@property (strong, nonatomic) IBOutlet UISearchBar *search; 
@end

и

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
[searchBar setShowsCancelButton:YES animated:YES];

NSArray *searchBarSubViews = [[self.search.subviews objectAtIndex:0] subviews];
UIButton *cancelButton;
for (UIView *subView in searchBarSubViews) {
    if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
        cancelButton = (UIButton*)subView;
        break;
    }
}
if (cancelButton) {

    [cancelButton setTitle:@"New cancel" forState:UIControlStateNormal];

}
 //insert this two lines below if you have a button appearance like this "Ne...cel" 

[searchBar setShowsCancelButton:NO animated:YES];
[searchBar setShowsCancelButton:YES animated:YES]; 
}

Ответ 8

В iOS 7, если вы установили displaysSearchBarInNavigationBar = YES на UISearchDisplayController, замена названия кнопки отмены через рекурсию subview или прокси-сервера не будет работать.

Вместо этого используйте свою собственную кнопку на панели viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
    UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"A Custom Title", nil)
                                                                style:UIBarButtonItemStyleBordered
                                                               target:self
                                                               action:@selector(cancelButtonTapped:)];

    // NB: Order is important here.
    //     Only do this *after* setting displaysSearchBarInNavigationBar to YES
    //     as that when UISearchDisplayController creates it navigationItem
    self.searchDisplayController.navigationItem.rightBarButtonItem = barItem;
}

Ответ 9

Рабочий код Джеремитрипа в Swift

Я не смог найти тот же код в Swift, чтобы сам "перевел" его:

func searchDisplayControllerWillBeginSearch(controller: UISearchDisplayController) {
    self.searchDisplayController?.searchBar.showsCancelButton = true
    var cancelButton: UIButton
    var topView: UIView = self.searchDisplayController?.searchBar.subviews[0] as UIView
    for subView in topView.subviews {
        if subView.isKindOfClass(NSClassFromString("UINavigationButton")) {
        cancelButton = subView as UIButton
        cancelButton.setTitle("My Custom Title", forState: UIControlState.Normal)
        }
    }
}

Ответ 10

Если вы просто хотите локализовать по умолчанию кнопку "Отменить" для кнопки "Отмена", я предпочитаю изменять значение CFBundleDevelopmentRegion от en до вашего локализованного региона в Info.plist в проекте.

Вот мое изменение,

<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>

после этого название по умолчанию "Отмена" будет отображаться как китайский "取消". Это изменение также повлияет на все значения по умолчанию для региона, например, названия действий в картонных операциях в UITextField/UITextView будут локализованы, "Выбрать" → "选择", "Вставить" → "粘贴"...

Кстати, файл Info.plist может быть полностью локализован.

Наслаждайтесь!

Ответ 11

Вместо ссылки на непубличный класс UINavigationButton я сделал следующее. Я надеюсь, что это пройдет через обзор App Store!

for (id subview in searchBar.subviews) {
    if ([subview respondsToSelector:@selector(setTitle:)]) {
        [subview setTitle:@"Map"];
    }
}

Ответ 12

Если у вас по-прежнему возникают проблемы с изменением кнопки "Отмена" в 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:@"Hi" forState:UIControlStateNormal];
    }
}

Ответ 13

если SearchBar находится в navigationBar, код будет отличаться от обычного ответа; Вместо этого вам нужно искать subviews NavigationBar.

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
UINavigationBar * navigationBar =  self.navigationController.navigationBar;

for (UIView *subView in navigationBar.subviews){
    if([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]){
        [(UIButton*)subView setTitle:@"İptal" forState:UIControlStateNormal];
    }
}}

и эта работа в iOS7 +, если вы все еще не можете установить заголовок, вы должны изучить просмотр отладки - вот как я решил эту проблему.

В этом кратком руководстве очень хорошо описаны ключевые моменты View-Debugging:

http://www.raywenderlich.com/98356/view-debugging-in-xcode-6

Ответ 14

Рабочий короткий код в Swift 2.1 (проверен iOS7-9)

@IBOutlet weak var searchBar: UISearchBar!
func enableSearchBarCancelButton(enable: Bool, title: String? = nil) {
    searchBar?.showsCancelButton = enable
    if enable {
        if let _cancelButton = searchBar?.valueForKey("_cancelButton"),
            let cancelButton = _cancelButton as? UIButton {
                cancelButton.enabled = enable //comment out if you want this button disabled when keyboard is not visible
                if title != nil {
                    cancelButton.setTitle(title, forState: UIControlState.Normal)
                }
        }
    }
}