Swift 如何将UISearchController放置到navigationTitle,以及如何通过按钮启用和禁用它?
我是Swift新手,不知道是否有可能将UIsearchcontroller放置在navgationtitle中,并通过位于navigationRightItem的按钮隐藏和取消隐藏UIsearchcontroller。 我见过许多将UISearchBar从对象库放置到navigationTitle的示例,但没有uisearchcontroller的示例。有些人甚至说,ios10 Swift已经不推荐使用对象库中的UISearch栏。 请澄清反对意见,以及为什么我不应该从对象库中使用UISearchBar。 哪一种是firebase tableview搜索的最佳实践。 如果您能给出代码示例,我将非常高兴。Swift 如何将UISearchController放置到navigationTitle,以及如何通过按钮启用和禁用它?,swift,search,uisearchbar,uisearchcontroller,Swift,Search,Uisearchbar,Uisearchcontroller,我是Swift新手,不知道是否有可能将UIsearchcontroller放置在navgationtitle中,并通过位于navigationRightItem的按钮隐藏和取消隐藏UIsearchcontroller。 我见过许多将UISearchBar从对象库放置到navigationTitle的示例,但没有uisearchcontroller的示例。有些人甚至说,ios10 Swift已经不推荐使用对象库中的UISearch栏。 请澄清反对意见,以及为什么我不应该从对象库中使用UISearc
提前谢谢。UISearchBar UISearchBar尚未被弃用。UISECHARBAR是一个UIVIEW,可以放置在任何你想要的地方,包括导航栏,但也可以在屏幕中间,如果这是你想要的。可以通过编程方式执行此操作,也可以使用Interface Builder拖动搜索栏并将其放置在一个视图中 使用UISearchBar 实现搜索的一种方法是使用UISearchBar,将其放在navigationItem.titleView中,并将视图控制器设置为此搜索栏的代理。当用户与搜索栏交互时,您的视图控制器会收到通知,您必须在同一视图控制器中处理搜索逻辑。例如,您可能需要检测搜索是否处于活动状态,以确定要用于表视图的数据源-如果搜索未处于活动状态,则显示所有项目;如果搜索处于活动状态,则仅显示项目的子集。或者,您可能希望为主视图显示一个布局,为搜索结果显示另一个布局。同样,您必须在视图控制器中处理此逻辑。这就是UISearchController派上用场的地方 使用UISearchController UISearchController是为您提供UISearchBar的UIViewController。UISearchController非常有用,因为它可以帮助您在新的视图控制器中显示搜索结果,从而使搜索逻辑与主逻辑分离。 要解决问题中的特定问题,请记住,您在navigationItem.titleView中放置的内容是UISearchBar,而不是UISearchController。您可以自己创建此UISearchBar,也可以创建一个UISearchController并使用其搜索栏(searchController.searchBar) 在navigationItem.titleView中放置UISearchBar与使用navigationItem.searchController属性相比 在navigationItem.titleView中放置UISearchBar是多个应用程序中使用的常见模式。然而,在iOS 11中,苹果引入了navigationItem.searchController属性。这里没有什么不推荐的,但当涉及到在导航栏中使用搜索栏时,苹果似乎更希望我们这样做 下面是一个如何工作的示例 主视图控制器: 用于显示搜索结果的视图控制器:
class LanguagesSearchResultsViewController: UIViewController {
// MARK: - Properties
// Complete list of items to search. If you're doing a network request for your search term then you don't need this.
let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]
// The data source for your search results
var searchResults: [String] = []
// MARK: - IBOutlets
@IBOutlet weak var tableView: UITableView!
// MARK: - UIViewController methods
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
}
(…)
}
// MARK: - UISearchResultsUpdating
extension LanguagesSearchResultsViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard let searchText = searchController.searchBar.text else { return }
searchResults = languages.filter { $0.contains(searchText) }
tableView.reloadData()
}
}
// MARK: - UITableViewDataSource
extension LanguagesSearchResultsViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "LanguageTableViewCell") as? LanguageTableViewCell else { return UITableViewCell() }
let language = searchResults[indexPath.row]
cell.languageNameLabel.text = language
return cell
}
}
如果您仍然希望标题视图中的搜索栏包含您描述的显示/隐藏行为,那么您需要一些更为定制的内容,无论是否使用UISearchController。其他问题已经有很多答案可以帮助你做到这一点。希望这有助于澄清您的选择。UISearchBar UISearchBar尚未被弃用。UISECHARBAR是一个UIVIEW,可以放置在任何你想要的地方,包括导航栏,但也可以在屏幕中间,如果这是你想要的。可以通过编程方式执行此操作,也可以使用Interface Builder拖动搜索栏并将其放置在一个视图中 使用UISearchBar 实现搜索的一种方法是使用UISearchBar,将其放在navigationItem.titleView中,并将视图控制器设置为此搜索栏的代理。当用户与搜索栏交互时,您的视图控制器会收到通知,您必须在同一视图控制器中处理搜索逻辑。例如,您可能需要检测搜索是否处于活动状态,以确定要用于表视图的数据源-如果搜索未处于活动状态,则显示所有项目;如果搜索处于活动状态,则仅显示项目的子集。或者,您可能希望为主视图显示一个布局,为搜索结果显示另一个布局。同样,您必须在视图控制器中处理此逻辑。这就是UISearchController派上用场的地方 使用UISearchController UISearchController是为您提供UISearchBar的UIViewController。UISearchController非常有用,因为它可以帮助您在新的视图控制器中显示搜索结果,从而使搜索逻辑与主逻辑分离。 要解决问题中的特定问题,请记住,您在navigationItem.titleView中放置的内容是UISearchBar,而不是UISearchController。您可以自己创建此UISearchBar,也可以创建一个UISearchController并使用其搜索栏(searchController.searchBar) 在navigationItem.titleView中放置UISearchBar与使用navigationItem.searchController属性相比 在navigationItem.titleView中放置UISearchBar是多个应用程序中使用的常见模式。然而,在iOS 11中,苹果引入了navigationItem.searchController属性。这里没有什么不推荐的,但当涉及到在导航栏中使用搜索栏时,苹果似乎更希望我们这样做 下面是一个如何工作的示例 主视图控制器: 用于显示搜索结果的视图控制器:
class LanguagesSearchResultsViewController: UIViewController {
// MARK: - Properties
// Complete list of items to search. If you're doing a network request for your search term then you don't need this.
let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]
// The data source for your search results
var searchResults: [String] = []
// MARK: - IBOutlets
@IBOutlet weak var tableView: UITableView!
// MARK: - UIViewController methods
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
}
(…)
}
// MARK: - UISearchResultsUpdating
extension LanguagesSearchResultsViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard let searchText = searchController.searchBar.text else { return }
searchResults = languages.filter { $0.contains(searchText) }
tableView.reloadData()
}
}
// MARK: - UITableViewDataSource
extension LanguagesSearchResultsViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "LanguageTableViewCell") as? LanguageTableViewCell else { return UITableViewCell() }
let language = searchResults[indexPath.row]
cell.languageNameLabel.text = language
return cell
}
}
如果您仍然希望在标题视图中显示搜索栏,请显示/隐藏