Подтвердить что ты не робот

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

4b9b3361

Ответ 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;
}

Ответ 11

Я пытаюсь помочь вам, но я не уверен, что я нахожу настоящую проблему.

Согласно Документация Apple:

showsCancelButton

boolean свойство, указывающее, является ли кнопка отмены отображается

Но для скрытия кнопки отмены, возможно, вы должны использовать:

setShowsCancelButton(_:animated:)

enter image description here

Я надеюсь, что это может быть полезно.