Невозможно получить UISearchController в моей панели навигации программно - PullRequest
0 голосов
/ 17 января 2019

У меня есть контроллер основного вида, он имеет полноэкранный режим 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 голосов
/ 17 января 2019

UITabbarController не имеет UINavigationController, поэтому он не имеет UINavigationBar.

Чтобы вы могли сделать:

  • Добавьте ячейку в TableView, чтобы она действовала как строка поиска
  • Добавление панели навигации в ViewController
  • Добавить пользовательский вид в вид, чтобы он действовал как контейнер

Возможны и другие варианты, просто я хочу указать вам правильное направление.

0 голосов
/ 31 июля 2019
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.
    }
0 голосов
/ 17 января 2019

Добавить переменную 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...