What I've done to achieve this:
#1 - I call the following code from my View Controller in order to initialize a UISearchResultsController but hide the search bar initially and trigger it using Элемент кнопки с кнопкой < /p>
Код: Выделить всё
// Called from viewDidLoad
private func configureSearchExperience() {
let image = UIImage(named: "searchIconName")
searchController = createSearchController()
searchController?.searchBar.placeholder = searchPlaceHolder
searchController?.searchBar.setImage(image, for: .search, state: .normal)
searchController?.searchBar.autocapitalizationType = .none
searchController?.searchBar.isHidden = true
navigationItem.searchController = nil
navigationItem.hidesSearchBarWhenScrolling = false
}
private func createSearchController() -> UISearchController {
let viewController = UIHostingController(rootView: SearchResultsSwiftUIView())
let search = CustomSearchController(searchResultsController: viewController)
search.delegate = self
search.showsSearchResultsController = true
search.obscuresBackgroundDuringPresentation = true
search.searchBar.delegate = self
return search
}
// Called from viewDidLoad
private func addBarButtons() {
let settingsButton = createButton(imageName: settingsIconName,
action: #selector(showSettings),
accessibilityLabel: viewModel.settingsAccessibilityIdentifier)
let searchButton = createButton(imageName: searchOutlineIconName,
action: #selector(launchSearchExperience),
accessibilityLabel: viewModel.searchAccessibilityIdentifier)
let stackView = UIStackView(arrangedSubviews: [searchButton, settingsButton])
stackView.axis = .horizontal
stackView.spacing = viewModel.barButtonInterItemSpacing
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: stackView)
}
private func createButton(imageName: String, action: Selector, accessibilityLabel: String) -> UIButton {
let button = UIButton(type: .system)
if let image = UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal) {
button.setImage(image, for: .normal)
}
button.addTarget(self, action: action, for: .touchUpInside)
button.accessibilityLabel = accessibilityLabel
return button
}
@objc func launchSearchExperience() {
navigationItem.searchController = searchController
// A short delay prevents occasional UI glitches when activating the search controller immediately after adding it
// to the navigation item. The 0.1s delay is an empirically chosen value that balances responsiveness and stability.
// It was also suggested in: https://stackoverflow.com/q/27951965/1619193
let searchActivationDelay = 0.1
DispatchQueue.main.asyncAfter(deadline: .now() + searchActivationDelay) { [weak self] in
self?.searchController?.isActive = true
self?.searchController?.becomeFirstResponder()
}
}
< /code>
#2 - это пользовательский searchresultscontroller, ответственный за отображение строки поиска только тогда, когда активируется uisearchresultscontroller: < /p>
class CustomSearchController: UISearchController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
searchBar.isHidden = false
searchBar.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
searchBar.isHidden = true
}
}
#1 - мы запускаем Icon в баторе. alt = "Ipad Bare Coots для uisearchresultscontroller" src = "https://i.sstatic.net/ct2s4sgy.png"/>
#2 - Результат поиска активируется
Подробнее здесь: https://stackoverflow.com/questions/795 ... n-icon-tap