Скрыть кнопку отмены UISearchBar

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Для тех, кто не может или не хочет подкласса 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];

in viewWillDisappear:!

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

Ответ 3

Как и в ответе Нимрода, вы также можете подклассифицировать UISearchDisplayController и реализовать метод setActive:animated::

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

Ответ 4

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

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

Ответ 5

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
        }
    }

}

Ответ 6

Была ли эта проблема при использовании UISearchBar с UISearchController. Я использую свою собственную кнопку отмены, поскольку кнопка отмены не показывалась на iPad с showsCancelButton = YES, теперь она не будет скрываться на iPhone с помощью showsCancelButton = NO

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

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

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

Reset 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;
    });
}

Ответ 7

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

searchController.searchBar.showsCancelButton = false;

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

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

- (void)didPresentSearchController:(UISearchController *)searchController

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

Ответ 8

Просто основанный на проблемах, которые у меня были до того, как вы попытались установить его в:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

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

Ответ 9

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

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>

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

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

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

Ответ 10

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

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

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

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

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