Показать панель поиска в навигационной панели без прокрутки на iOS 11

Я присоединяю UISearchController к свойству navigationItem.searchController UITableViewController на iOS 11. Это прекрасно работает: я могу использовать красивую панель поиска в стиле iOS 11.

Тем не менее, я хотел бы сделать панель поиска видимой при запуске. По умолчанию пользователь должен прокрутить таблицу вверх, чтобы увидеть панель поиска. Кто-нибудь знает, как это возможно?

enter image description here enter image description here

Слева: ситуация по умолчанию после запуска. Справа: строка поиска сделана видимой (путем прокрутки вверх). Я хотел бы, чтобы панель поиска была видна после запуска, как на скриншоте справа.

Я уже обнаружил, что панель поиска можно сделать видимой, установив для свойства hidesSearchBarWhenScrolling элемента навигации значение false. Однако это приводит к тому, что панель поиска всегда видна - даже при прокрутке вниз - а это не то, что мне нужно.

Ответы

Ответ 1

Следующее делает видимым полосу прокрутки, затем позволяет скрыть ее при прокрутке:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

Использование isActive не делало того, что я хотел, он делает активным полосу прокрутки (показывая кнопку отмены и т.д.), когда все, что я хочу, - это видно.

Ответ 2

Вы можете установить для свойства isActive значение true после добавления searchController в navigationItem.

Именно так:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

Ответ 3

Следующее делает searchBar, чтобы стать первым респондентом:

   override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        DispatchQueue.main.async {
            self.searchController.searchBar.becomeFirstResponder()
        }
    }