Реализация панели поиска в панели навигации с помощью UISearchController - PullRequest
0 голосов
/ 05 июля 2018

Я реализовал searchBar, используя UISearchController, используя следующий код -

var searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search here..."
definesPresentationContext = true
searchController.searchBar.delegate = self
searchController.searchBar.sizeToFit()
if #available(iOS 11.0, *) {

self.navigationItem.searchController = searchController
} else {
// Fallback on earlier versions
navigationItem.titleView = searchController.searchBar
navigationItem.titleView?.layoutSubviews()
}

Теперь у меня есть два вопроса-

  1. Панель поиска находится под панелью навигации (см. Прикрепленное изображение), как получить панель поиска поверх панели навигации, которая использовалась при реализации панели поиска с панелью UISearch.

  2. Кнопка отмены не появляется на правой стороне панели поиска. enter image description here

Ответы [ 3 ]

0 голосов
/ 05 июля 2018
  1. Для этого есть свойство

    searchController.hidesNavigationBarDuringPresentation = true
    
  2. Есть пробел, поэтому это может быть кнопка Canel белого текста. Вы можете знать это наверняка в Debugger Navigator (Cmd + 7) -> View UI Hierarcy. Текст белой кнопки может быть вызван пользовательским стилем панели навигации

0 голосов
/ 05 июля 2018

Я не думаю, что вы можете сделать это изначально. Но вы можете активировать панель поиска при открытии меню (не забудьте установить searchController.hidesNavigationBarDuringPresentation в true):

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

Но это будет скрывать UINavigationBar, так что это не то, что вы действительно хотите. Так что, может быть, лучше, вы можете создать собственную панель навигации и скрыть родную. Вот краткий пример:

1 - Создание быстрого xib-файла NavigationBarView с горизонтальной UIStackView, задней UIButton с фиксированной шириной и UISearchBar:

class NavigationBarView: UIView {

    var backAction: (()->Void)?
    @IBOutlet weak var searchBarView: UISearchBar!

    override func awakeFromNib() {
        super.awakeFromNib()

        // Customize your search bar
        self.searchBarView.showsCancelButton = true
    }

    @IBAction func backButtonPressed(_ sender: Any) {
        self.backAction?()
    }
}

2 - Вместо использования UITableViewController создайте UIViewController с вертикальным UIStackView, который содержит вид с фиксированной высотой 64 и UITableView:

class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var containerView: UIView!
    let navigationBarView: NavigationBarView = NavigationBarView.viewFromNib() // Custom helper to instantiate a view, see below

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.navigationBar.isHidden = true // hide the native UINavigationBar

        self.navigationBarView.backAction = {
            self.navigationController?.popViewController(animated: true)
        }
        self.navigationBarView.searchBarView.delegate = self
        self.navigationBarView.add(in: self.containerView) // Custom helper to put a view in a container view, see below

        // Other stuff     
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }

Вот мои помощники:

extension UIView {
    static public func viewFromNib <GenericView: UIView> () -> GenericView {
        let className = String(describing: self)
        guard let instance = UINib(nibName: className, bundle: nil)
            .instantiate(withOwner: nil, options: nil).first as? GenericView else {
                // If this happens, it means the xcodeproj is broken
                fatalError("Ho no its broken!")
        }
        return instance
    }

    func add(in superView: UIView) {
        self.translatesAutoresizingMaskIntoConstraints = false
        superView.addSubview(self)
        self.topAnchor.constraint(equalTo: superView.topAnchor).isActive = true
        self.bottomAnchor.constraint(equalTo: superView.bottomAnchor).isActive = true
        self.leftAnchor.constraint(equalTo: superView.leftAnchor).isActive = true
        self.rightAnchor.constraint(equalTo: superView.rightAnchor).isActive = true
    }
}
0 голосов
/ 05 июля 2018

Йо можно попробовать по приведенному ниже коду и, пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

if self.searchController != nil {
            self.searchController.isActive = false
        }
        isSearching =  true
        self.searchController = UISearchController(searchResultsController:  nil)
        self.searchController.searchResultsUpdater = self
        self.searchController.delegate = self
        self.searchController.searchBar.delegate = self
        self.searchController.hidesNavigationBarDuringPresentation = false
        self.searchController.dimsBackgroundDuringPresentation = false
        self.navigationItem.titleView = searchController.searchBar
        self.definesPresentationContext = false

        self.searchController.searchBar.returnKeyType = .done
...