【问题标题】:Search Controller in Navigation Item confusing behaviour导航项中的搜索控制器令人困惑的行为
【发布时间】:2017-10-11 09:45:02
【问题描述】:

所以我的导航项上有一个搜索控制器。

// View controller
var searchController = UISearchController(searchResultsController: nil)

override func viewWillAppear(_ animated: Bool) {
    tableView.reloadData()
    if #available(iOS 11.0, *) {
        navigationController?.navigationBar.prefersLargeTitles = true
    }
    if employeeSearchList.count > 10 {
        if #available(iOS 11.0, *) {
            navigationItem.searchController = searchController
        } else {
            tableView.tableHeaderView = searchController.searchBar
        }
    } else {
        if #available(iOS 11.0, *) {
            let search = UISearchController(searchResultsController: nil)
            navigationItem.searchController = search
            navigationItem.searchController = nil
        } else {
            tableView.tableHeaderView = nil
        }
    }
    UIView.animate(withDuration: 0.50, animations: {
        self.view.layoutIfNeeded()
    })
}

这段代码运行完美。如果计数小于 10,则设置搜索控制器,否则设置为空的搜索控制器,然后设置为 nil,使其从 UI 中消失。

func viewDidLoad() {
    .
    .
    .
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.tintColor = tintColor

    // Table view editing delegate -> delete operation
    if employeeSearchList.count < 10 {
        if #available(iOS 11.0, *) {
            let search = UISearchController(searchResultsController: nil)
            navigationItem.searchController = search
            navigationItem.searchController = nil
        } else {
            tableView.tableHeaderView = nil
        }
        UIView.animate(withDuration: 0.50, animations: {
            tableView.reloadData()
            self.view.layoutIfNeeded()
        })
    }
    .
    .
    .
}

现在我的问题是,当我在此视图控制器上方显示一个视图控制器然后将其关闭时,viewWillAppear 执行良好,但搜索控制器不显示。但是如果我推动视图控制器并返回,它就会显示出来。

这两种操作的主要区别是什么? (推/弹出和呈现/关闭)

【问题讨论】:

    标签: ios swift ios11 uisearchcontroller


    【解决方案1】:

    应该是:

    navigationController.navigationItem.searchController = searchController
    

    代替:

    navigationItem.searchController = searchController
    

    后者只会在下次navigationController被刷新/加载/无论合适的术语是什么时生效?

    【讨论】:

    【解决方案2】:

    当你呈现一个视图控制器表单时,你正在呈现一个新的视图控制器层次结构,我的意思是,你在之前的导航控制器之外。如果您从导航控制器推送新控制器,则将其添加到堆栈中,并且将显示导航栏。

    【讨论】:

    • 我希望得到类似的东西 - 在每种情况下都会调用什么额外的函数、委托等。
    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多