Разрыв между панелью навигации и первой ячейкой UITableViewCell

#swift #uitableview #uisearchcontroller

#swift #uitableview #uisearchcontroller

Вопрос:

У меня есть UITableViewController с контроллером поиска, встроенным в панель навигации.

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

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

вот моя реализация. Некоторый код был отредактирован для конфиденциальности. Но все, что касается настройки контроллера просмотра, все равно должно быть там:

 import Foundation

class SearchViewController: UITableViewController {

    fileprivate lazy var searchController: UISearchController = {
        let searchController = UISearchController(searchResultsController: nil)
        searchController.dimsBackgroundDuringPresentation = false
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.searchBar.showsCancelButton = true
        searchController.searchBar.delegate = self
        return searchController
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        setupTableView()

        navigationItem.titleView = searchController.searchBar
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.navigationBar.tintColor = BrandColor.appleDarkGray
    }

}

extension ExploreSearchViewController: UISearchBarDelegate {

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        presentingViewController?.dismiss(animated: true, completion: nil)
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        if let searchText = searchBar.text {
            tableView.refreshControl?.beginRefreshing()
            searchedText = searchText
        }
    }
}

// MARK: - UITableView Methods
extension ExploreSearchViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return searchResultsProvider.searchResults.count
    }

    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        guard searchResultsProvider.canLoadNextPage else { return }

        // handle paging here...
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard searchResultsProvider.searchResults.count > indexPath.row else { return UITableViewCell() }

        // Setup search result cell here...
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Handle cell did tap here...
    }

    @objc private func refresh() {
        searchResultsProvider.refreshResults()
    }

    // MARK - Table View Helpers

    private func setupTableView() {
        registerCells()
        self.tableView.backgroundColor = .white
        self.tableView.contentInsetAdjustmentBehavior = .always
        self.tableView.refreshControl = UIRefreshControl()
        self.tableView.refreshControl?.addTarget(self, action: #selector(refresh), for: .valueChanged)
        self.tableView.useDefaultPageLoadingIndicator()
        self.tableView.setBackgroundViewIfEmpty(message: Self.searchInitialMessage, remedyButton: nil)
    }

    private func registerCells() {
        //Register Table View Cells here...
    }
}
  

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

Кто-нибудь видел такое поведение раньше? Если да, то как вы это решили?

Комментарии:

1. Не могли бы вы, пожалуйста, показать какой-нибудь код о том, как вы реализуете свой tableview? Не удается воспроизвести проблему из-за ограниченной предоставленной информации…

2. Вы пробовали tableView.contentInsetAdjustmentBehavior = .never ? Помогает ли это?

3. @paky извините. Отредактировал сообщение с помощью моего кода. Был отредактирован некоторый код. Но все, что касается представления таблицы, контроллера поиска и настройки представления, есть.

4. По-прежнему не удается воспроизвести разрыв из предоставленного кода, и я попытался добавить NavigationController / TableView / SearchBar с помощью раскадровки и программно, но по-прежнему безуспешно. Позвольте мне высказать предположение, вы добавляете tableHeaderView или какое-либо насекомое в свой useDefaultPageLoadingIndicator() или setBackgounrdViewIfEmpty()?

5. Ах, глупый я, не подумал о стиле TableView при просмотре вашего кода. Приятно слышать, что вы это исправили. Хорошего дня 😉

Ответ №1:

Проблема была вызвана тем, что стиль представления таблицы был установлен на .grouped на предыдущем контроллере представления.

Установка стиля на .plain решила эту проблему.

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