Я не думаю, что вы можете сделать это изначально. Но вы можете активировать панель поиска при открытии меню (не забудьте установить 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
}
}