UISearchController searchBar показываетCancelButton не соблюдается
Я добавил UISearchController в свое приложение и установил его searchBar в titleView
моего navigationItem
.
Это работает, но я вижу кнопку отмены, несмотря на то, что она установлена с showsCancelButton
на false
.
searchController = UISearchController(searchResultsController: searchResultsController)
searchController.searchResultsUpdater = searchResultsUpdater
// Configure the searchBar
searchController.searchBar.placeholder = "Find Friends..."
searchController.searchBar.sizeToFit()
searchController.searchBar.showsCancelButton = false
self.definesPresentationContext = true
navigationItem.titleView = searchController.searchBar
![enter image description here]()
Ответы
Ответ 1
Это похоже на ошибку в iOS. Такое же поведение, о котором я рассказывал, можно увидеть в примере, представленном Apple
https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html
В документации указано, что по умолчанию это NO
, но это, похоже, не так. Установка showsCancelButton
в NO
кажется неэффективной.
Я подал на него радиолокатор, и я жду, чтобы услышать.
Ответ 2
Простое решение в Swift3 - нам нужно сделать CustomSearchBar без кнопки отмены, а затем переопределить соответствующее свойство в новом CustomSearchController:
class CustomSearchBar: UISearchBar {
override func setShowsCancelButton(_ showsCancelButton: Bool, animated: Bool) {
super.setShowsCancelButton(false, animated: false)
}}
class CustomSearchController: UISearchController {
lazy var _searchBar: CustomSearchBar = {
[unowned self] in
let customSearchBar = CustomSearchBar(frame: CGRect.zero)
return customSearchBar
}()
override var searchBar: UISearchBar {
get {
return _searchBar
}
}}
В MyViewController я инициализирую и настраиваю searchController с помощью этого нового пользовательского подкласса:
var mySearchController: UISearchController = ({
// Display search results in a separate view controller
// let storyBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
// let alternateController = storyBoard.instantiateViewController(withIdentifier: "aTV") as! AlternateTableViewController
// let controller = UISearchController(searchResultsController: alternateController)
let controller = CustomSearchController(searchResultsController: nil)
controller.searchBar.placeholder = NSLocalizedString("Enter keyword (e.g. iceland)", comment: "")
controller.hidesNavigationBarDuringPresentation = false
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.searchBarStyle = .minimal
controller.searchBar.sizeToFit()
return controller
})()
Ответ 3
Я согласен, это похоже на ошибку. Проблема в том, что searchController
сохраняет сброс свойства showsCancelButton
в searchBar. Я нашел решение, которое включает в себя:
- подклассификация
UISearchBar
игнорировать setShowsCancelButton
.
- чтобы заставить searchController использовать этот подкласс, вы должны подклассом
UISearchController
.
- И тогда вы обнаружите, что searchBar не запускает методы делегирования контроллера поиска, поэтому вы должны запускать их отдельно...
Сложный, но, похоже, это трюк. Вы можете найти полный ответ здесь.
Ответ 4
Мне пришлось исправить, вложив немного взлома...
Установка альфа-0.0 на viewDidLoad, потому что он будет мигать.
Прежде чем спросить... willPresentSearchController не будет работать.
extension GDSearchTableViewController: UISearchControllerDelegate {
func didPresentSearchController(searchController: UISearchController) {
searchController.searchBar.setShowsCancelButton(false, animated: false)
searchController.searchBar.becomeFirstResponder()
UIView.animateWithDuration(0.1) { () -> Void in
self.view.alpha = 1.0
searchController.searchBar.alpha = 1.0
}
}
}
Ответ 5
Я бы также добавил
searchController.hidesNavigationBarDuringPresentation = false
searchController.delegate = self
searchController.searchBar.delegate = self
Посмотрите, поможет ли назначение этих делегатов.
Ответ 6
Вы можете подклассифицировать UISearchBar и переопределить метод layoutSubviews
super.layoutSubviews()
self.showsCancelButton = false
Ответ 7
Моим решением было установить атрибут каждый раз заново, когда я использовал searchcontroller, соответственно, свою панель поиска. Я инициализировал searchcontroller лениво, не устанавливая атрибут, а затем сделал
searchController.searchBar.showsCancelButton = false
каждый раз перед началом поиска.
Вы можете сделать это в методах UISearchControllerDelegate i.e...
Ответ 8
Мы хотели, чтобы в строке поиска не было кнопки "Отмена" , но она появляется, когда пользователь постучал в панель поиска.
Затем мы хотели, чтобы кнопка "Отмена" исчезла, если пользователь нажал "Отмена" , иначе панель поиска потеряла первого ответчика.
Что, наконец, помогло мне:
В процессе создания:
searchBar.showsCancelButton = NO;
Мы используем подкласс UISearchBar и переопределяем searchBarShouldBeginEditing таким образом:
-(BOOL)searchBarShouldBeginEditing:(UISearchBar*)searchBar {
self.showsCancelButton = YES;
return YES;
}
Мы также переопределяем resignFirstReponder (в подклассе UISearchBar):
-(BOOL)resignFirstResponder
{
self.showsCancelButton = NO;
return [super resignFirstResponder];
}
Ответ 9
Это работало для меня (iOS 10):
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.searchController.searchBar.showsCancelButton = NO;
}
Ответ 10
Как установить его с помощью [searchBar setShowsCancelButton:NO animated:NO];
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchBar_Class/#//apple_ref/occ/instm/UISearchBar/setShowsCancelButton:animated:
Ответ 11
Я пытаюсь помочь вам, но я не уверен, что я нахожу настоящую проблему.
Согласно Документация Apple:
showsCancelButton
boolean свойство, указывающее, является ли кнопка отмены отображается
Но для скрытия кнопки отмены, возможно, вы должны использовать:
setShowsCancelButton(_:animated:)
![enter image description here]()
Я надеюсь, что это может быть полезно.