27

У меня есть UISearchDisplayController и UISearchBar, подключенный к моему ViewController через Outlets из моего nib.Скрыть кнопку отмены UISearchBar

Я хотел бы скрыть кнопку отмены, чтобы пользователь никогда ее не видел. Проблема в том, что следующий код скрывает кнопку, но только после ее отображения пользователю в течение миллисекунды (например, он мигает на симуляторе и устройстве, а затем исчезает из вида).

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{ 
    controller.searchBar.showsCancelButton = NO; 
} 

Есть ли лучший способ скрыть это?

ответ

36

мне удалось скрыть кнопку «Отмена» на подклассы UISearchBar и переопределить этот метод:

-(void)layoutSubviews{ 
    [super layoutSubviews]; 
    [self setShowsCancelButton:NO animated:NO]; 
} 
+1

Это работает! Я создаю контроллер представления с функциями поиска, а затем поставлю весь контроллер представления внутри popover для iPad. Очевидно, что кнопка «Отмена» не нужна для iPad popover, поэтому я ищу решение без кнопки-кнопки, и это работает! –

+2

Это работает просто отлично! Я думаю, что я пробовал каждый другой способ, описанный, чтобы исправить это, чтобы избежать подкласса, но не смог это сделать! Но это исправляло это безупречно! Благодаря! – kentrh

+0

Это не сработало для меня, я использовал способ уведомления BFeher – paulvs

0

Только на основе вопросов, которые я имел, прежде чем вы пробовали установить его в:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 

Я не знаю, как задать этот вопрос в вашем вопросе извините, если это неуместно.

+0

Да, Я попробовал это перед публикацией здесь. Он не работает: \ – ArtSabintsev

+0

, поэтому вам нужно настроить кнопку отмены при создании UISearchDisplayController, не дожидаясь начала поиска. – jamesC

+0

Пробовал это тоже. Не работает. – ArtSabintsev

6

Это, кажется, ошибка в Xcode. Я отправил эту ошибку на сайт отчетов об ошибках Apple, и они продолжили просить больше кода примера и прецедентов.

Спасибо всем за вашу попытку решить эту проблему.

+2

У меня такая же проблема, но наоборот. Я попытался создать UISearchDisplayController и UISearchBar, используя файл nib и программно, но вместо того, чтобы скрывать кнопку отмены, мне нужно, чтобы она отображалась все время. В контроллере у меня есть представление, чтобы кнопка была видимой, а также несколькими методами делегата, но когда я отменяю поиск, кнопка исчезает, а затем снова появляется. Надеюсь, что это будет отсортировано в ближайшее время. –

+2

Они ответили, что это известная проблема, и они пытаются ее исправить. – ArtSabintsev

+0

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

8

Подобный ответ Нимрода, вы также можете создать подкласс UISearchDisplayController и реализовать setActive:animated: метод:

- (void)setActive:(BOOL)visible animated:(BOOL)animated { 
    [super setActive:visible animated:animated]; 
    self.searchBar.showsCancelButton = NO; 
} 
15

У меня была такая же проблема, но она по-другому.

Для тех, кто не может или не хочет подкласс UISearchDisplayController, я исправил проблему путем добавления слушателя UIKeyboardWillShowNotification и установка [self setShowsCancelButton:NO animated:NO] там.

В viewWillAppear::

// Add keyboard observer: 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillAppear:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 

Затем вы создаете:

- (void)keyboardWillAppear:(NSNotification *)notification 
{ 
    [YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO]; 
} 

Не забудьте добавить,

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

в viewWillDisappear:!

Надеюсь, это поможет!

+0

Не работает отлично, если клавиатура уже открыта перед краном. –

+0

Удивительное спасибо, именно то, что я искал. – GameDev

0

Если при редактировании поля поиска на панели поиска появляется кнопка отмены, вы можете сделать следующее: подклассы панель поиска и его реализации протокола UITextFieldDelegate:

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate> 

Затем осуществить textFieldDidBeginEditing: и сделать что-то вроде:

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    [self setShowsCancelButton:self.cancelButtonShown animated:NO]; 
} 

Это позволит убедиться, что кнопка отмены не будет отображаться.

+0

'MLUISearchBar.m: 25: 37: Property 'cancelButtonShown' не найден на объекте типа 'MLUISearchBar *'' ошибка сборки – Gank

2
class CustomSearchBar: UISearchBar { 

    override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) { 
     super.setShowsCancelButton(false, animated: false) 
    } 

} 

class CustomSearchController: UISearchController, UISearchBarDelegate { 

    lazy var _searchBar: CustomSearchBar = { 
     [unowned self] in 
     let customSearchBar = CustomSearchBar(frame: CGRectZero) 
     customSearchBar.delegate = self 
     return customSearchBar 
    }() 

    override var searchBar: UISearchBar { 
     get { 
      return _searchBar 
     } 
    } 

} 
+0

Это отлично работает. Но я не понимаю необходимость установки делегата панели поиска. –

2

Если вы хотите, чтобы избежать подклассов, реализовать

searchController.searchBar.showsCancelButton = false; 

в этих двух методов делегата (Не забудьте назначить делегатов):

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController 

- (void)didPresentSearchController:(UISearchController *)searchController 

сначала вызывается каждый раз, когда вы обновляете searchBar (кнопка «Отмена» отображается по умолчанию) и вторая - для первой активации searchBar.

+0

Не удалось заставить это работать, к сожалению. – lostintranslation

+0

безупречный! не хотел подкласса! – SergioM

2

При использовании UISearchBar с UISearchController. Я использую свою собственную кнопку отмены, поскольку кнопка отмены wasn't showing on iPad с showsCancelButton = YES, теперь она не будет скрываться на iPhone с showsCancelButton = NO!

Следующие работали для меня.

Установите делегат и начальное значение:

- (void)viewDidLoad 
{ 
    // ... 
    self.searchController.searchBar.showsCancelButton = NO; 
    self.searchController.searchBar.delegate = self; 
} 

showsCancelButton Сброс к NO 0.1с после текста строке начинается редактирование.

#pragma mark - UISearchBarDelegate 
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     self.searchController.searchBar.showsCancelButton = NO; 
    }); 
} 
+0

Спасибо за ответ. Мне удалось скрыть кнопку отмены. – Ramakrishna

0

После UISearchDisplayController осуждается в iOS8, Apple даст поиска ручка презентации UISearchControllerDelegate.

так что вы можете переопределить SearchBar скрыть кнопку Отмена, как показано ниже:

- (void)didPresentSearchController:(UISearchController *)searchController { 
    [searchController.searchBar setShowsCancelButton:NO]; 
} 

если вам нужно скрытые кнопки Отмена в неактивном состоянии, необходимо установить SearchBar на INIT:

search = [[UISearchController alloc] initWithSearchResultsController:nil]; 
[search.searchBar setShowsCancelButton:NO]; 

 Смежные вопросы

  • Нет связанных вопросов^_^