无法以编程方式在导航栏中获取UISearchController

时间:2019-01-17 12:19:16

标签: ios swift uitableview uisearchcontroller

我有一个主视图控制器,它有一个全屏UITableView,它由Firebase和下面的TabBarController的值填充。 UITableView的所有代码均以编程方式处理。我需要添加两个选项:首先,一个用于搜索结果的搜索栏和一个用于从Firebase获取的各种类别的过滤器选项。

这是我在ViewController中更新的代码:

import UIKit
import Firebase

class PostTable: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchControllerDelegate,UISearchResultsUpdating {

    func updateSearchResults(for searchController: UISearchController) {

    }

    var tableView:UITableView!

    var posts = [Post]()

    var searchController : UISearchController!


    override func viewDidLoad() {
        super.viewDidLoad()

        if Auth.auth().currentUser == nil {
            switchStoryboard()
        }

        tableView = UITableView(frame: view.bounds, style: .plain)
        view.addSubview(tableView)

        let cellNib = UINib(nibName: "PostTableViewCell", bundle: nil)
        tableView.register(cellNib, forCellReuseIdentifier: "postCell")
        var layoutGuide:UILayoutGuide!

        layoutGuide = view.safeAreaLayoutGuide

        tableView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
        tableView.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true

        tableView.delegate = self
        tableView.dataSource = self
        tableView.tableFooterView = UIView()
        tableView.reloadData()

        searchController = UISearchController(searchResultsController: nil)
        searchController.delegate = self
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false // displays tableview

        let scb = self.searchController.searchBar
        scb.tintColor = UIColor.white
        scb.placeholder = "SEARCH"
        scb.barTintColor = UIColor.white

        if let textfield = scb.value(forKey: "searchField") as? UITextField {
            textfield.textColor = UIColor.green
            if let backgroundview = textfield.subviews.first {
                backgroundview.backgroundColor = UIColor.white
                backgroundview.layer.cornerRadius = 10
                backgroundview.clipsToBounds = true
            }
        }

        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController
            navigationItem.hidesSearchBarWhenScrolling = false
        } else {
            self.tableView.tableHeaderView = searchController.searchBar
            searchController.searchBar.tintColor = UIColor.green
            searchController.searchBar.barTintColor = UIColor.green
        }
        definesPresentationContext = true


        observePosts()
    }

3 个答案:

答案 0 :(得分:3)

添加变量UISearchController

var searchController : UISearchController!

&然后在viewDidLoad

中添加代码
    searchController = UISearchController(searchResultsController: nil)
    searchController.delegate = self
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false // displays tableview

    let scb = self.searchController.searchBar
    scb.tintColor = UIColor.white
    scb.placeholder = "SEARCH"
    scb.barTintColor = UIColor.white

    if let textfield = scb.value(forKey: "searchField") as? UITextField {
        textfield.textColor = UIColor.greenColor
        if let backgroundview = textfield.subviews.first {
            backgroundview.backgroundColor = UIColor.white
            backgroundview.layer.cornerRadius = 10
            backgroundview.clipsToBounds = true
        }
    }

    if #available(iOS 11.0, *) {
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
    } else {
        self.tableView.tableHeaderView = searchController.searchBar
        searchController.searchBar.tintColor = UIColor.greenColor
        searchController.searchBar.barTintColor = UIColor.greenColor
    }
    definesPresentationContext = true

答案 1 :(得分:0)

UITabbarController没有UINavigationController,因此它没有UINavigationBar。

所以您可以这样做:

  • 在您的TableView中添加一个单元格,使其像搜索栏一样
  • 将导航栏添加到ViewController
  • 向您的视图添加自定义视图以充当容器

可能还有更多选择,只是要将您指向正确的方向。

答案 2 :(得分:0)

override func viewDidLoad() {
        super.viewDidLoad()
        searchController = UISearchController(searchResultsController: nil)
        searchController.searchBar.autocapitalizationType = .none

        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController

            // Make the search bar always visible.
            navigationItem.hidesSearchBarWhenScrolling = false
        } else {
            // For iOS 10 and earlier, place the search controller's search bar in the table view's header.
            tableView.tableHeaderView = searchController.searchBar
        }

        searchController.delegate = self
        searchController.dimsBackgroundDuringPresentation = false // The default is true.
    }