From f1acb64551feadc28470243c34cb3b57307d312a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 15 May 2026 11:08:13 +0000 Subject: [PATCH] Preserve POI type search text until attribute editor closes Keep the feature picker search query in memory while the POI tab bar modal is open so returning from a mistaken selection does not clear it. Clear the stored query when the modal is dismissed (save, cancel, swipe, or equivalent). The search field clear control still resets the query via the existing text-change path. Co-Authored-By: Tobias --- .../POI/POIFeaturePickerViewController.swift | 51 ++++++++++++++----- src/iOS/POI/POITabBarController.swift | 7 +++ 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/iOS/POI/POIFeaturePickerViewController.swift b/src/iOS/POI/POIFeaturePickerViewController.swift index 161003f33..94d6e6fa0 100644 --- a/src/iOS/POI/POIFeaturePickerViewController.swift +++ b/src/iOS/POI/POIFeaturePickerViewController.swift @@ -27,6 +27,14 @@ private var mostRecentArray: [PresetFeature] = [] private var mostRecentMaximum = 0 class POIFeaturePickerViewController: UITableViewController, UISearchBarDelegate { + /// Persists the type-picker search query while the POI editor stays open; cleared when that editor is dismissed. + private static var preservedFeatureTypeSearchText: String? + + /// Called when the POI attribute editor modal is dismissed (save, cancel, swipe, etc.). + class func clearPreservedFeatureTypeSearchText() { + preservedFeatureTypeSearchText = nil + } + private var featureList: [PresetFeatureOrCategory] = [] private var searchArray: [PresetFeature] = [] @IBOutlet var searchBar: UISearchBar! @@ -71,6 +79,34 @@ 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 preserved = Self.preservedFeatureTypeSearchText 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 +277,8 @@ 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) - } - tableView.reloadData() + Self.preservedFeatureTypeSearchText = searchText + refreshSearchResults(for: searchText) } @IBAction func configure(_ sender: Any) { diff --git a/src/iOS/POI/POITabBarController.swift b/src/iOS/POI/POITabBarController.swift index ca4c67ef3..52320e530 100644 --- a/src/iOS/POI/POITabBarController.swift +++ b/src/iOS/POI/POITabBarController.swift @@ -46,6 +46,13 @@ class POITabBarController: UITabBarController { } } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + if isBeingDismissed || isMovingFromParent { + POIFeaturePickerViewController.clearPreservedFeatureTypeSearchText() + } + } + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated)