首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推送下一个视图控制器时删除UISearchBar中的延迟

推送下一个视图控制器时删除UISearchBar中的延迟
EN

Stack Overflow用户
提问于 2019-02-19 13:03:21
回答 1查看 618关注 0票数 0

Xcode 10.1,Swift 4.2

UISearchController ViewController A有LargeTitles、和UITableView

当选择ViewController B(也是TableView)后,UISearchBar占用的空间出现延迟,如动画中所示。

ViewController B也有一个UISearchController,但按照通常的行为,它是隐藏的,直到用户拖下屏幕。

有人知道如何防止这种情况发生吗?

其他资料及守则:

ViewController A当单元格被点击时,它使用显示(例如推)在故事板上推动ViewController B,并选择动画。数据是使用prepareForSegue方法注入的。

代码语言:javascript
复制
performSegue(withIdentifier: "showLogbook", sender: self)

ViewController B:

代码语言:javascript
复制
class LogbookVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchResultsUpdating {

    //Extract
    private let searchController = UISearchController(searchResultsController: nil)


    @IBOutlet private var addButton: UIBarButtonItem!
    @IBOutlet private var shareButton: UIBarButtonItem!
    @IBOutlet private var backButton: UIBarButtonItem!
    @IBOutlet private var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        tableView.rowHeight = 75.0
        //loading tableView data
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.definesPresentationContext = true
    configureSearchController()
    fetchAndSortLogEntries()
}

private func configureSearchController() {
    navigationItem.searchController = searchController
    searchController.searchResultsUpdater = self
    searchController.searchBar.scopeButtonTitles = ["Newest", "Oldest"]
    searchController.searchBar.delegate = self
    searchController.searchBar.barStyle = .black
    searchController.searchBar.tintColor = K.Colors.appMid
    searchController.searchBar.keyboardAppearance = .dark
    searchController.searchBar.returnKeyType = .done
    searchController.dimsBackgroundDuringPresentation = false
    let attributes = [NSAttributedString.Key.foregroundColor: K.Colors.appMid]
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal)
    searchController.searchBar.setValue("Reset", forKey: "_cancelButtonText")
    let searchBarCancelButton = searchController.searchBar.value(forKey: "cancelButton") as? UIButton
    searchBarCancelButton?.setTitle("Reset", for: .normal)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-20 17:21:18

我认为当使用LargeTitles并在相邻的ViewControllers中有两个UISearchControllers时,这是一个bug。

我发现,通过将UISearchController添加到NavigationItem in viewDidAppear修复了这个问题,但是必须异步添加它,否则会发生以下致命错误:

代码语言:javascript
复制
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Only one palette with a top boundary edge can be active outside of a transition.

这段代码需要添加到两个ViewControllers中,以便在导航回ViewController A时也可以防止问题行为。

Xcode 10.1,Swift 4.2

代码语言:javascript
复制
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.async {
            self.navigationItem.searchController = self.searchController
            self.searchController.searchResultsUpdater = self
            self.searchController.searchBar.delegate = self
        }
    }

此代码将确保当下一个NavigationBar出现时不会隐藏该ViewController

代码语言:javascript
复制
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isNavigationBarHidden = false
    }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54767018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档