Курсор UISearchBar UISearchController показывает первое использование, а не последующее

В первый раз, когда эта часть приложения загружает курсор панели поиска контроллера поиска, он показывает желаемое.

Поиск с помощью курсора

(Проблема) Когда поиск закрывается, а затем (позже) перезагружается, курсор отсутствует:

Поиск без курсора

Это повторяется только с загрузкой/удалением, то есть ничего, что, по-видимому, могло бы/должно изменить оттенок вещей, в результате чего курсор стал бы цветом фона (как это обычно бывает в ответ на отсутствующий курсор, из вопросов и ответов SO, которые я видел на тема.) Тем не менее, больше ничего не работает, просто исчезает курсор.

Некоторые (возможно) осложняющие факторы:

  • Этот ViewController, который загружает/выгружает UISearchController (и встраивает UISearchBar в заголовок UINavigationController), является VC содержимого внутри моего пользовательского контейнера VC. Иерархия следующая: (1) UIWindow (2) UINavigationController (3) ContainerVC (4) ContainedVC [родителем является ContainerVC, этот VC выполняет загрузку/выгрузку UISearchController].
  • Существуют различные обратные вызовы делегатов (UISearchController, UISearchBar), которые пытаются настроить поведение (например, скрыть кнопку отмены, остановить закрытие между ними), которые, надеюсь, не влияют на что-то, но к сведению.
  • «Выгрузить» (остановить/снести) включает в себя различные усилия, чтобы заставить его уйти, удаление панели поиска из представления заголовка, установка контроллера поиска active=false и тому подобное. (Поскольку это происходит после этого, кажется, что это связано, поэтому я пробовал различные перестановки на случай, если что-то поможет. Не повезло.)

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

Я не могу исключить, что цвет курсора изменился, я не совсем понимаю, как он устанавливается/наследуется, особенно с учетом имеющегося у меня стека VC, и как его проверить в отладчике. Я думаю, что это так же просто, как установить глобальный оттенок.

Примечание. Это приложение использует раскадровку с прямыми настройками и не использует прокси внешнего вида много. Тем не менее, он имеет:

    // Default tint for application...
    UIApplication.sharedApplication().delegate?.window??.tintColor = mainBrandColor
    UIToolbar.appearance().tintColor = mainBrandColor

... и я пробовал с различными перестановками оттенков UISearchBar, UINavigationBar через прокси-сервер внешнего вида с таким же поведением (сначала работает, потом не так много). Глядя на это в разное время (т.е. когда работает и когда нет) это показывает тот же цвет:

(lldb) po searchController.searchBar.tintColor

Примечание. Отдельное использование UISearchController (когда вызывающий VC не является дочерним элементом контейнера, а является отправленным VC) НЕ демонстрирует эту проблему. Курсор остается правильным цвет.

Среда: это приложение iOS9.x в Swift на XCode 7.1.

Вот некоторый код, где homeVC является родительским/контейнерным VC:

    if nil == homeVC.searchController {
        homeVC.searchController = UISearchController(searchResultsController: nil)
        homeVC.searchController!.searchResultsUpdater = self
        homeVC.searchController!.delegate = self
        homeVC.searchController!.searchBar.delegate = self
        homeVC.searchController!.searchBar.showsCancelButton = false
        homeVC.searchController!.searchBar.returnKeyType = .Done
        homeVC.searchController!.searchBar.placeholder = "Add Item"
        homeVC.searchController!.searchBar.searchBarStyle = UISearchBarStyle.Minimal
        homeVC.searchController!.dimsBackgroundDuringPresentation = false
        homeVC.searchController!.hidesNavigationBarDuringPresentation = false
    }

    homeVC.navigationItem.titleView              = homeVC.searchController!.searchBar

Я пробовал с ленивой загрузкой и без нее, с уничтожением/воссозданием и без.

Будем признательны за любые советы/мысли о том, где искать и как устранять неполадки.


person Adam Jack    schedule 09.11.2015    source источник
comment
Было бы полезно, если бы вы могли опубликовать ссылку на суть всего кода этого ViewController. В первую очередь я хочу, если у вас есть какой-либо синтаксис блока где-либо в этом классе. Если это так, я хочу посмотреть, какой код в них выполняется. Я также хочу увидеть, делегатом чего является этот класс, и если какой-либо из методов обратного вызова из классов, делегатом которого он является, запускает блоки завершения для выполнения обратного вызова. (Например, как в NSURLSessionDataTask.)   -  person CommaToast    schedule 22.01.2016


Ответы (6)


Вы делаете self.searchController.searchBar.showsCancelButton = NO;

У меня была точно такая же проблема и оказывается, что это дело как-то связано. Попробуйте закомментировать его и посмотреть, вернулся ли курсор.

person user1491604    schedule 04.01.2016
comment
Кстати, чтобы все заработало, нужно сделать - (void)didPresentSearchController:(UISearchController *)searchController { searchController.searchBar.showsCancelButton = NO; } - person user1491604; 05.01.2016
comment
Спасибо, что предложили это. Я так надеялся, но это ничего не изменило для меня. Я потратил так много времени, пытаясь отследить это с помощью различных комбинаций вещей, что я просто больше не могу ясно видеть. Кстати: я изменил строку, которую вы сказали, у меня есть didPresent, и у меня есть тот же код в willPresent (чтобы попытаться остановить мигание кнопки отмены). - person Adam Jack; 08.01.2016
comment
Ну хоть чем-то помог :) - person user1491604; 21.01.2016
comment
Это было проблемой для меня. Исправление заключалось в том, чтобы установить цвет оттенка сразу после searchController.searchBar.showsCancelButton = NO - person stackunderflow; 02.09.2016

У меня была такая же проблема. Уловка, которая сработала для меня, заключалась в установке tintColor UISearchBar, когда он становится firstResponder

func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
    searchBar.tintColor = UIColor.redColor()
    return true
}
person JohnGrana    schedule 09.03.2016
comment
Извините, но я полностью переписал этот пользовательский интерфейс (в значительной степени из-за этого и в третий раз). Таким образом, я больше не могу тестировать ваше исправление. Если другие пользователи проголосуют за этот ответ (или другой ответ), я в конечном итоге отмечу один из двух как правильный ответ. Спасибо за вашу помощь. - person Adam Jack; 06.07.2016

У меня была большая головная боль с этой же проблемой. user1491604 (первый ответ) прав, что причина проблемы:

searchController.searchBar.showsCancelButton = false //Swift 3

Комментирование полностью устранило проблему, но затем я столкнулся с тем, что делать, если я НЕ хочу вообще показывать кнопку «Отмена», как показано ниже:

введите здесь описание изображения

Если вы вообще не хотите показывать кнопку отмены, ответ пользователя 1491604 не сработает. Я последовал ответу Вити Шурапова (который работает в этой ситуации), чтобы реализовать свой собственный SearchController:

https://stackoverflow.com/questions/33227177/hiding-cancel-button-on-search-bar-in-uisearchcontroller

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

Затем, чтобы использовать его в viewDidLoad, я использовал:

let searchController = CustomSearchController(searchResultsController: nil)
//...configure the rest of the searchController...

//DELETE- searchController.searchBar.showsCancelButton -you can delete this line wherever your using it

Проблема решена для меня

person Lance Samaria    schedule 25.06.2017
comment
Спасибо тебе за это! - person Brittany; 06.09.2017

У меня была такая же проблема, если вы установите dimsBackgroundDuringPresentation = NO и obscuresBackgroundDuringPresentation = NO, вы снова увидите курсор, даже если у вас скрыта кнопка отмены.

person Allen    schedule 26.02.2016
comment
Извините, но я полностью переписал этот пользовательский интерфейс (в значительной степени из-за этого и в третий раз). Таким образом, я больше не могу тестировать ваше исправление. Если другие пользователи проголосуют за этот ответ (или другой ответ), я в конечном итоге отмечу один из двух как правильный ответ. Спасибо за вашу помощь. - person Adam Jack; 06.07.2016

Установите цвет оттенка поиска view из раскадровки на любой цвет, который вы хотели бы использовать в качестве курсора.

Будьте осторожны

установите цвет оттенка в разделе view

вместо раздела searchBar в attribute inspector в раскадровке.

person Aashish    schedule 05.10.2017

Для меня сработало исправление:

searchBar.setShowsCancelButton(false, animated: false)
searchBar.becomeFirstResponder()

in func searchBarTextDidBeginEditing(_ searchBar: UISearchBar)

person Victor Fagerström    schedule 28.11.2017