首页 > 解决方案 > UINavigationController + UISearchController

问题描述

概括

UINavigationController当孩子嵌入到导航项的搜索控制器中UIViewController时,会显示损坏的动画。UISearchController

仅当我UISearchController在导航项中设置时才会发生这种情况。

下图中有 2 个示例:

  1. 更改位置ViewController- 单击Back(设置)按钮时有动画延迟。
  2. 自定义ViewController- 工作正常。

流动

UITableViewController > UIViewController 与 UISearchController 嵌入在导航项中

图片说明

发现

我研究了这种行为,发现了一些描述类似行为但与我设置的不完全相同的答案。

尝试通过将导航项搜索控制器设置为来实现以下帖子中建议的解决方案nil- 没有解决此问题:

NavigationItem 中嵌入的 UISearchBar 动画损坏

代码如下。提前致谢。

class ChangeLocationViewController: UIViewController {

    // MARK: - Outlets
    @IBOutlet weak var locationBanner: CustomView!
    @IBOutlet weak var locationNameLabel: UILabel!
    @IBOutlet weak var locationTimeLabel: UILabel!
    @IBOutlet weak var mapView: MKMapView!

    let loadingBanner = LoadingBanner()

    var resultsViewController: GMSAutocompleteResultsViewController?
    var searchController: UISearchController?
    let locationManager = LocationManager.shared

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.locationManagerDelegate = self

        GMSPlacesClient.provideAPIKey(AppSettings.googleAPIKey)

        self.definesPresentationContext = true;


        resultsViewController = GMSAutocompleteResultsViewController()
        resultsViewController?.delegate = self

        let autoCompletedFilter = GMSAutocompleteFilter()
        autoCompletedFilter.type = .city
        resultsViewController?.autocompleteFilter = autoCompletedFilter

        searchController = UISearchController(searchResultsController: resultsViewController)
        searchController?.searchResultsUpdater = resultsViewController
        searchController?.hidesNavigationBarDuringPresentation = false
        searchController?.searchBar.placeholder = "Search a place".localized
        searchController?.delegate = self

        // Setting the search controller [when it is not set, everything works great :)]
        navigationItem.searchController = searchController
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // Removing the search controller
        self.navigationItem.searchController = nil
    }
}

标签: iosswiftuinavigationcontrolleruisearchbaruisearchcontroller

解决方案


设置navigationItem.searchControllernil其他视图控制器也出现的时间。

class ChangeLocationViewController: UIViewController {
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        /* searchController */
        searchController.isActive = false
        navigationItem.searchController = nil
    }
}

class SettingsTableController: UITableViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        /* searchController */
        navigationItem.searchController = nil
    }
}

推荐阅读