Ответ 1
Мне удалось скрыть кнопку "Отмена" путем подкласса UISearchBar
и переопределить этот метод:
-(void)layoutSubviews{
[super layoutSubviews];
[self setShowsCancelButton:NO animated:NO];
}
У меня есть UISearchDisplayController и UISearchBar подключен к моему ViewController через Outlets из моего nib.
Я хотел бы скрыть кнопку отмены, чтобы пользователь никогда ее не видел. Проблема в том, что следующий код скрывает кнопку, но только после ее отображения пользователю в течение миллисекунды (например, он мигает на симуляторе и устройстве, а затем исчезает из вида).
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
controller.searchBar.showsCancelButton = NO;
}
Есть ли лучший способ скрыть это?
Мне удалось скрыть кнопку "Отмена" путем подкласса UISearchBar
и переопределить этот метод:
-(void)layoutSubviews{
[super layoutSubviews];
[self setShowsCancelButton:NO animated:NO];
}
У меня была та же проблема, но я исправил ее по-другому.
Для тех, кто не может или не хочет подкласса 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:
!
Надеюсь, это поможет!
Как и в ответе Нимрода, вы также можете подклассифицировать UISearchDisplayController
и реализовать метод setActive:animated:
:
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
self.searchBar.showsCancelButton = NO;
}
Кажется, это ошибка в Xcode. Я отправил эту ошибку на сайт отчетов об ошибках Apple, и они продолжили просить более пример кода и прецедентов.
Спасибо всем за вашу попытку решить эту проблему.
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
}
}
}
Была ли эта проблема при использовании 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;
});
}
Если вы хотите избежать подкласса, выполните
searchController.searchBar.showsCancelButton = false;
в этих двух методах делегата (не забудьте назначить делегатов):
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
- (void)didPresentSearchController:(UISearchController *)searchController
Первый вызывается каждый раз, когда вы обновляете searchBar (кнопка "Отмена" отображается по умолчанию), а вторая - для первой активации searchBar.
Просто основанный на проблемах, которые у меня были до того, как вы попытались установить его в:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
Я не знаю, как задать этот вопрос в вашем вопросе извините, если это неуместно.
Если при редактировании поля поиска на панели поиска появляется кнопка отмены, вы можете сделать следующее: подклассировать строку поиска и выполнить ее протокол UITextFieldDelegate
:
@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>
Затем реализуем textFieldDidBeginEditing:
и делаем что-то вроде:
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[self setShowsCancelButton:self.cancelButtonShown animated:NO];
}
Это означает, что кнопка отмены не будет отображаться.
После того, как UISearchDisplayController устарел в iOS8, Apple предоставит представление поиска ручек в UISearchControllerDelegate.
чтобы вы могли переопределить SearchBar, чтобы скрыть кнопку "Отмена", как показано ниже:
- (void)didPresentSearchController:(UISearchController *)searchController {
[searchController.searchBar setShowsCancelButton:NO];
}
если вам нужна скрытая кнопка Отменить из неактивного состояния, вам нужно установить searchBar в init:
search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];