我似乎无法强制嵌入视图控制器中的搜索栏在最初加载视图控制器时显示出来。我尝试添加navigationItem.hidesSearchBarWhenScrolling = false
时确实会在加载时强制显示搜索栏,但随后会使title
变小。有没有办法使搜索栏出现大标题?
下面的代码和图片说明了我的意思。
import Moya
import RealmSwift
import UIKit
class MeetingsViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
private var searchController: UISearchController?
private var provider = MoyaProvider<NewLyfe>()
private var meetings: [Meeting]? {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
setupSearchController()
setupBarItems()
updateViews()
}
}
// MARK: - private functions
extension MeetingsViewController {
private func setupSearchController() {
let storyboard = UIStoryboard(name: "Main", bundle: .main)
let searchResultController = storyboard.instantiateViewController(withClass: SearchResultTableViewController.self)
searchController = UISearchController(searchResultsController: searchResultController)
searchController?.searchBar.placeholder = "neighborhood, city, state, or zip code"
searchController?.searchBar.delegate = self
searchController?.searchResultsUpdater = searchResultController
navigationItem.searchController = searchController
}
private func setupBarItems() {
let mapIcon = UIBarButtonItem(image: UIImage(systemName: "map.fill"), style: .plain, target: self, action: #selector(presentMapModal))
mapIcon.tintColor = .systemGreen
navigationItem.rightBarButtonItem = mapIcon
let filterIcon = UIBarButtonItem(image: UIImage(systemName: "slider.horizontal.3"), style: .plain, target: self, action: #selector(presentFilterModal))
filterIcon.tintColor = .systemGreen
navigationItem.leftBarButtonItem = filterIcon
}
private func updateViews() {
let realm = try? Realm()
let filterOptions = realm?.objects(FilterOptions.self).first
searchController?.searchBar.text = filterOptions?.name
fetchMeetings(using: filterOptions)
}
private func fetchMeetings(using filterOptions: FilterOptions?) {
guard let options = filterOptions, let lat = options.latitude.value, let long = options.longitude.value else { return }
provider.request(.meetings(day: "Sun", program: "AA", region: "\(lat),\(long),10")) { (result) in
switch result {
case .success(let response):
do {
self.meetings = try response.map([Meeting].self)
} catch let error {
print("Error decoding meetings: \(error)")
}
case .failure(let error):
print("Error fetching meetings: \(error)")
}
}
}
}
// MARK: - @objc functions
extension MeetingsViewController {
@objc func presentFilterModal() {
performSegue(withIdentifier: "presentFilterModal", sender: nil)
}
@objc func presentMapModal() {
performSegue(withIdentifier: "presentMapModal", sender: nil)
}
}
// MARK: - Table view data source/delegate
extension MeetingsViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return meetings?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "meetingCell", for: indexPath)
cell.textLabel?.text = "\(meetings?[indexPath.row].name ?? "")"
cell.detailTextLabel?.text = "\(meetings?[indexPath.row].day ?? "")"
return cell
}
}
// MARK: - Search bar delegate
extension MeetingsViewController: UISearchBarDelegate {
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
updateViews()
}
}
这就是我想要的样子:
这是当前的样子:
答案 0 :(得分:1)
我知道我参加聚会有点晚了,但我遇到了同样的问题,我通过将 navigationItem.hidesSearchBarWhenScrolling = false
添加到我的 setupSearchController
函数中解决了这个问题。
所以在你的情况下,函数看起来像这样:
private func setupSearchController() {
let storyboard = UIStoryboard(name: "Main", bundle: .main)
let searchResultController = storyboard.instantiateViewController(withClass: SearchResultTableViewController.self)
searchController = UISearchController(searchResultsController: searchResultController)
searchController?.searchBar.placeholder = "neighborhood, city, state, or zip code"
searchController?.searchBar.delegate = self
searchController?.searchResultsUpdater = searchResultController
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
}