Скрыть кнопку отмены UISearchBar - PullRequest
28 голосов
/ 14 декабря 2011

У меня есть UISearchDisplayController и UISearchBar, подключенные к моему ViewController через выходы из моего пера.

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

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

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

Ответы [ 10 ]

37 голосов
/ 15 марта 2012

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

-(void)layoutSubviews{
    [super layoutSubviews];
    [self setShowsCancelButton:NO animated:NO];
}
15 голосов
/ 01 февраля 2013

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

Для тех, кто не может или не хочет создавать подклассы 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:!

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

8 голосов
/ 11 сентября 2012

Аналогично ответу Нимрода, вы также можете создать подкласс UISearchDisplayController и реализовать метод setActive:animated::

- (void)setActive:(BOOL)visible animated:(BOOL)animated {
    [super setActive:visible animated:animated];
    self.searchBar.showsCancelButton = NO;
}
6 голосов
/ 26 декабря 2011

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

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

3 голосов
/ 05 мая 2016

Возникла эта проблема при использовании UISearchBar с UISearchController.Я использую свою собственную кнопку отмены, так как кнопка отмены не отображалась на 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;
    });
}
3 голосов
/ 23 марта 2016
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
        }
    }

}
2 голосов
/ 31 марта 2016

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

searchController.searchBar.showsCancelButton = false;

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

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

- (void)didPresentSearchController:(UISearchController *)searchController

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

0 голосов
/ 06 февраля 2017

После того, как UISearchDisplayController устарел в iOS8, Apple передает дескриптор поиска в UISearchControllerDelegate.

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

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

если вам нужна скрытая кнопка Отмена из неактивного состояния, вам нужно установить searchBar на init:

search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];
0 голосов
/ 08 августа 2014

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

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>

Затем внедрите textFieldDidBeginEditing: и сделайте что-то вроде:

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

Это гарантирует, что кнопка отмены не появится.

0 голосов
/ 14 декабря 2011

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

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

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

...