#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
решила эту проблему.
Я считаю, что причина, по которой сгруппированный стиль вызывает пустое пространство, заключается в том, что он добавляет пустой заголовок раздела над ячейками.