导航栏上的搜索栏未显示在viewdidload()上

时间:2020-02-11 20:14:45

标签: ios swift

我似乎无法强制嵌入视图控制器中的搜索栏在最初加载视图控制器时显示出来。我尝试添加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()
    }

}

这就是我想要的样子:

enter image description here

这是当前的样子:

enter image description here

1 个答案:

答案 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

}