Скрыть панель поиска при нажатии кнопки отмены и изменить размер панели навигации

У меня есть панель поиска, реализованная с использованием UISearchController внутри моей панели навигации. Существует также табличное представление, верхнее ограничение которого установлено на нижнюю часть панели навигации.

Желаемое поведение: Когда нажимается кнопка отмены, панель поиска скрывается, и верхнее ограничение табличного представления возвращается к тому, что было до того, как панель поиска была удалена (см. скриншот # 1 в конце этого сообщения)

Текущее поведение: При нажатии кнопки отмены строка поиска исчезает, но верхнее ограничение tableView не изменяется в ответ (см. скриншот # 3)

Возможное решение этой проблемы - вручную обновлять ограничения при каждом нажатии кнопки отмены. Однако я не могу найти способ получить доступ к ограничениям tableView из метода UISearchBarDelegatesearchBarCancelButtonClicked

Фрагмент кода:

class ViewController: UIViewController {

    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.searchBar.delegate = self

        /* Adding search button to the navbar */

        /* setting tableView constraints */

        /* tableView delegate/datasource methods, etc... */
    } 

    @objc func searchButtonTapped(_ sender: UIBarButtonItem) {
        setup()
        navigationItem.searchController = searchController
    }

    func setup() {
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.sizeToFit()
    }
}

extension UISearchBarDelegate {
    public func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {

        navigationItem.searchController = nil

        /* Cannot access tableview constraints from here because extension is outside of the class */
    }
}

До нажатия кнопки поиска.

До нажатия кнопки отмены. enter image description here

После нажатия кнопки отмены. enter image description here

3
0
1 137
3

Ответы 3

Добавьте код одной строки следующим образом:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar){

   self.navigationItem.searchController = nil

   self.view.setNeedsLayout()

 /* Cannot access tableview constraints from here because extension is outside of the class */
}

(ДА, это правильно)

func searchBarCancelButtonClicked(_ searchBar: UISearchBar){

   self.navigationItem.searchController = nil

   self.view.setNeedsLayout()

 /* Cannot access tableview constraints from here because extension is outside of the class */
}

Это должен быть комментарий. Не ответ. Вы просто скопировали вставленный существующий ответ и добавили комментарий.

Rakesha Shastri 16.09.2018 08:48

Попробуйте обновить представление внутри контроллера навигации следующим образом:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar){
    navigationItem.searchController = nil // or searchController
    navigationController?.view.setNeedsLayout() // invalidate current layout 
    navigationController?.view.layoutIfNeeded() // force update layout
}

Другие вопросы по теме