导航项中的搜索控制器混淆行为
Search Controller in Navigation Item confusing behaviour
所以我的导航项上有一个搜索控制器。
// View controller
var searchController = UISearchController(searchResultsController: nil)
override func viewWillAppear(_ animated: Bool) {
tableView.reloadData()
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = true
}
if employeeSearchList.count > 10 {
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
} else {
if #available(iOS 11.0, *) {
let search = UISearchController(searchResultsController: nil)
navigationItem.searchController = search
navigationItem.searchController = nil
} else {
tableView.tableHeaderView = nil
}
}
UIView.animate(withDuration: 0.50, animations: {
self.view.layoutIfNeeded()
})
}
这段代码运行完美。如果计数小于10,则设置搜索控制器,否则设置为空搜索控制器,然后设置为nil
,使其从UI.
中消失
func viewDidLoad() {
.
.
.
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.tintColor = tintColor
// Table view editing delegate -> delete operation
if employeeSearchList.count < 10 {
if #available(iOS 11.0, *) {
let search = UISearchController(searchResultsController: nil)
navigationItem.searchController = search
navigationItem.searchController = nil
} else {
tableView.tableHeaderView = nil
}
UIView.animate(withDuration: 0.50, animations: {
tableView.reloadData()
self.view.layoutIfNeeded()
})
}
.
.
.
}
现在我的问题是,当我在这个视图控制器上方显示一个视图控制器然后关闭它时,viewWillAppear
执行正常但搜索控制器没有显示。但是,如果我按下视图控制器并返回,它就会出现。
这两种操作的主要区别是什么? (push/pop & present/dismiss)
当您呈现一个来自其他视图控制器时,您呈现了一个新的 viewController 层次结构,我的意思是,您在之前的导航控制器之外。如果您从导航控制器中推送一个新控制器,则将其添加到堆栈中,并且导航栏将显示。
应该是:
navigationController.navigationItem.searchController = searchController
而不是:
navigationItem.searchController = searchController
后者只会在下次 navigationController 时生效 refreshed/loaded/whatever 合适的术语是?
所以我的导航项上有一个搜索控制器。
// View controller
var searchController = UISearchController(searchResultsController: nil)
override func viewWillAppear(_ animated: Bool) {
tableView.reloadData()
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = true
}
if employeeSearchList.count > 10 {
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
} else {
if #available(iOS 11.0, *) {
let search = UISearchController(searchResultsController: nil)
navigationItem.searchController = search
navigationItem.searchController = nil
} else {
tableView.tableHeaderView = nil
}
}
UIView.animate(withDuration: 0.50, animations: {
self.view.layoutIfNeeded()
})
}
这段代码运行完美。如果计数小于10,则设置搜索控制器,否则设置为空搜索控制器,然后设置为nil
,使其从UI.
func viewDidLoad() {
.
.
.
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.tintColor = tintColor
// Table view editing delegate -> delete operation
if employeeSearchList.count < 10 {
if #available(iOS 11.0, *) {
let search = UISearchController(searchResultsController: nil)
navigationItem.searchController = search
navigationItem.searchController = nil
} else {
tableView.tableHeaderView = nil
}
UIView.animate(withDuration: 0.50, animations: {
tableView.reloadData()
self.view.layoutIfNeeded()
})
}
.
.
.
}
现在我的问题是,当我在这个视图控制器上方显示一个视图控制器然后关闭它时,viewWillAppear
执行正常但搜索控制器没有显示。但是,如果我按下视图控制器并返回,它就会出现。
这两种操作的主要区别是什么? (push/pop & present/dismiss)
当您呈现一个来自其他视图控制器时,您呈现了一个新的 viewController 层次结构,我的意思是,您在之前的导航控制器之外。如果您从导航控制器中推送一个新控制器,则将其添加到堆栈中,并且导航栏将显示。
应该是:
navigationController.navigationItem.searchController = searchController
而不是:
navigationItem.searchController = searchController
后者只会在下次 navigationController 时生效 refreshed/loaded/whatever 合适的术语是?