9

Впервые эта часть приложения загружает курсор строки поиска контроллера поиска, если это необходимо.Курсор UISearchController UISearchBar показывает первое использование, а не последующее

Search with Cursor

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

Search No Cursor

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

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

  • Этого ViewController, который загружает/выгружает UISearchController (и встраивают UISearchBar в название UINavigationController), составляет содержание VC в моем пользовательском контейнере VC. Иерархия: (1) UIWindow (2) UINavigationController (3) ContainerVC (4) ContainedVC [parent - это ContainerVC, этот VC выполняет загрузку/разгрузку UISearchController].
  • Существуют различные обратные вызовы делегатов (UISearchController, UISearchBar), которые пытаются настроить поведение (например, скрыть кнопку отмены, остановить закрытие между ними), которые, надеюсь, не влияют на вещи, но FYI.
  • «Разгрузка» (для остановки/срыва) включает в себя различные усилия, чтобы заставить его уйти, удалив панель поиска из заголовка, установив активный контроллер поиска = 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:

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

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

+0

Это поможет, если вы могли бы разместить ссылку на суть всего этого кода ViewController в. Прежде всего, я хочу, если у вас есть какой-либо синтаксис блока в любом месте этого класса. Если это так, я хочу посмотреть, какой код выполняется в них. Я также хочу видеть, что этот класс является делегатом, и если какой-либо из методов обратного вызова из классов является делегатом, блокируют блоки завершения для выполнения обратного вызова. (Как и в NSURLSessionDataTask.) – CommaToast

ответ

4

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

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

+0

BTW, чтобы заставить его работать, вы хотите сделать '- (void) didPresentSearchController: (UISearchController *) searchController { searchController.searchBar.showsCancelButton = NO; } ' – user1491604

+0

Спасибо за предложение. Я так надеялся, но это не изменило меня. Я потратил столько времени, пытаясь отследить это с помощью различных комбинаций вещей, я просто не могу видеть прямо. BTW: Я изменил строку, которую вы сказали, у меня есть didPresent, и у меня есть тот же код в willPresent (чтобы попытаться остановить кнопку отмены, мигающую в/из.) –

+0

Ну .. по крайней мере, я помог вам каким-то образом :) – user1491604

1

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

+0

Прошу прощения, но я полностью переписал этот интерфейс (в основном, из-за этого и в третий раз.) Как таковой я я больше не могу проверить ваше исправление. Если другие пользователи подтвердят этот ответ (или другой ответ), я в конечном итоге помету один из двух в качестве правильного ответа. Спасибо за вашу помощь. –

3

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

func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool { 
    searchBar.tintColor = UIColor.redColor() 
    return true 
} 
+0

Спасибо! Это сработало для меня. – Pangu

+0

Прошу прощения, но я полностью переписал этот интерфейс (в основном, из-за этого, и в третий раз.) Таким образом, я больше не могу проверить ваше исправление. Если другие пользователи подтвердят этот ответ (или другой ответ), я в конечном итоге помету один из двух в качестве правильного ответа. Спасибо за вашу помощь. –

+0

Работаю для меня тоже, спасибо товарищу –

1

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

searchController.searchBar.showsCancelButton = false //Swift 3 

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

enter image description here

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

https://stackoverflow.com/questions/29976503/uisearchcontroller-searchbar-showscancelbutton-not-being-respected/42030000#42030000

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 

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

+0

Спасибо за это! – Brittany

+0

@Brittany рад помочь! –

0

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

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

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

вместо searchBar секции, в в раскадровке.

0

Для меня починок, что работали был:

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

в func searchBarTextDidBeginEditing(_ searchBar: UISearchBar)

Смежные вопросы