【问题标题】:UINavigationController + UISearchControllerUINavigationController + UISearchController
【发布时间】:2020-01-01 19:27:58
【问题描述】:

总结

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

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

下图中有2个例子:

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

流程

UITableViewController > UIViewController 和 UISearchController 嵌入到导航项中

调查结果

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

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

Broken UISearchBar animation embedded in NavigationItem

代码如下。提前致谢。

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
    }
}

【问题讨论】:

  • 你试过self.navigationItem.searchController = nil中的代码viewDidDisappear而不是viewWillDisappear吗?
  • 相同的结果。谢谢。

标签: ios swift uinavigationcontroller uisearchbar uisearchcontroller


【解决方案1】:

当另一个视图控制器也出现时,将navigationItem.searchController 设置为nil

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
    }
}

【讨论】:

  • 刚试过,但动画延迟仍然存在。谢谢。
  • 我刚刚发现,当我单击标签栏返回上一个屏幕而不是单击导航返回按钮时 - 它工作正常。知道什么只能在导航栏中导致它吗?
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2016-03-06
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多