diff --git a/src/iOS/POI/POIFeaturePickerViewController.swift b/src/iOS/POI/POIFeaturePickerViewController.swift index 161003f33..a2bf554f3 100644 --- a/src/iOS/POI/POIFeaturePickerViewController.swift +++ b/src/iOS/POI/POIFeaturePickerViewController.swift @@ -71,6 +71,37 @@ class POIFeaturePickerViewController: UITableViewController, UISearchBarDelegate } } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + restorePreservedSearchIfNeeded() + } + + /// Re-applies the in-memory search query and reloads the table (used when restoring state and from `UISearchBarDelegate`). + private func refreshSearchResults(for searchText: String) { + if searchText.isEmpty { + searchArray = [] + } else { + let geometry = currentSelectionGeometry() + searchArray = PresetsDatabase.shared.featuresInCategory( + parentCategory, + matching: searchText, + geometry: geometry, + location: AppDelegate.shared.mainView.currentRegion) + } + tableView.reloadData() + } + + private func restorePreservedSearchIfNeeded() { + guard let tabController = tabBarController as? POITabBarController, + let preserved = tabController.preservedFeatureTypeSearchText, + !preserved.isEmpty + else { return } + if searchBar.text != preserved { + searchBar.text = preserved + } + refreshSearchResults(for: preserved) + } + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } @@ -241,19 +272,10 @@ class POIFeaturePickerViewController: UITableViewController, UISearchBarDelegate } func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { - if searchText.count == 0 { - // no search - searchArray = [] - } else { - // searching - let geometry = currentSelectionGeometry() - searchArray = PresetsDatabase.shared.featuresInCategory( - parentCategory, - matching: searchText, - geometry: geometry, - location: AppDelegate.shared.mainView.currentRegion) + if let tabController = tabBarController as? POITabBarController { + tabController.preservedFeatureTypeSearchText = searchText.isEmpty ? nil : searchText } - tableView.reloadData() + refreshSearchResults(for: searchText) } @IBAction func configure(_ sender: Any) { diff --git a/src/iOS/POI/POITabBarController.swift b/src/iOS/POI/POITabBarController.swift index ca4c67ef3..cbd406b14 100644 --- a/src/iOS/POI/POITabBarController.swift +++ b/src/iOS/POI/POITabBarController.swift @@ -11,6 +11,8 @@ class POITabBarController: UITabBarController { var keyValueDict = [String: String]() var relationList: [OsmRelation] = [] var selection: OsmBaseObject? + /// Type-picker search query kept for the lifetime of this editor session. + var preservedFeatureTypeSearchText: String? override func viewDidLoad() { super.viewDidLoad() @@ -46,6 +48,13 @@ class POITabBarController: UITabBarController { } } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + if isBeingDismissed || isMovingFromParent { + preservedFeatureTypeSearchText = nil + } + } + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated)