【问题标题】:Programmatically Show Navigation Bar's UISearchController以编程方式显示导航栏的 UISearchController
【发布时间】:2019-01-12 07:43:10
【问题描述】:

我在viewDidLoad()内配置了一个UISearchController如下:

let searchController = UISearchController(searchResultsController: nil);
searchController.delegate = self;
searchController.searchResultsUpdater = self;
searchController.searchBar.delegate = self;

self.searchController.isActive = true;
self.searchController.searchBar.becomeFirstResponder();

self.navigationItem.searchController = searchController;

虽然我已经设置了isActive 并将searchBar 设置为firstResponder,但是当视图出现在屏幕上时,UISearchController 是不活动的。手动点击该字段可以正确打开它。

在 iOS 12 中是否存在 isActivebecomeFirstResponder 属性在 viewDidLoad 中不受尊重的原因?

【问题讨论】:

    标签: ios swift uinavigationcontroller uisearchcontroller


    【解决方案1】:

    不确定那里发生了什么,但它在导航栏中是独一无二的。

    这似乎可以解决问题。

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        DispatchQueue.main.async(searchController.searchBar.becomeFirstResponder)
    }
    

    【讨论】:

    【解决方案2】:

    就我而言,在 iOS 12.x 中,我只是将 becomeFirstResponder() 放入 viewDidAppear,但有一点延迟,0.1 秒。添加这种延迟可以保证键盘的呈现。

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        self.definesPresentationContext = true
    
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            self.searchController.searchBar.becomeFirstResponder()
        }
    }
    

    我希望这会有所帮助。

    编辑:如果您支持 iOS 10 和 11,那么我过去的这个答案可能会对您有所帮助。 https://stackoverflow.com/a/53264329/3231194

    【讨论】:

    • 感谢您的回答,但希望不必延迟代码块的执行。
    • 这取决于你。这不会冻结 UI,而且据我所知,这是呈现 searchBar 键盘的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多