【问题标题】:Let my UISearchBar get focus automatically when the view is loaded加载视图时让我的 UISearchBar 自动获得焦点
【发布时间】:2016-11-02 13:38:37
【问题描述】:

这是我在导航栏中使用 UISearchBar 的视图:

我希望它在我的视图加载时自动聚焦。我尝试了一些基于this question 的方法。但没有一个工作。我必须点击搜索栏使其成为焦点。

这是我的代码之一:

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

    self.searchController.isActive = true

    DispatchQueue.main.async { [unowned self] in
        self.searchController.searchBar.becomeFirstResponder()
    }
}

有人提到 searchController 在 becomeFirstResponder 之后应该是活动的。我试过这个:

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

    DispatchQueue.main.async { [unowned self] in
        self.searchController.searchBar.becomeFirstResponder()
        self.searchController.isActive = true
    }
}

这次键盘确实出来了。但我无法在搜索栏中输入任何内容。

有什么想法吗?谢谢。

【问题讨论】:

  • 你试过在没有调试器的情况下运行它吗?
  • 您的搜索栏在导航栏中吗?
  • 你在设备上测试过吗?有时在模拟器上,键盘被 CMD + K 隐藏
  • 其实如果我的视图控制器是根视图控制器。不会有问题的。

标签: ios swift3 uisearchbar


【解决方案1】:

我按照建议重新创建我的项目。然后就可以了。我的代码:

class SearchViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate {

 ......

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

func didPresentSearchController(_ searchController: UISearchController)    {
    DispatchQueue.main.async { [unowned self] in
        self.searchController.searchBar.becomeFirstResponder()
    }
}

必须将becomeFirstRespnder放入主队列,否则键盘不会自动显示。

【讨论】:

    【解决方案2】:

    只要出现以下代码,我就可以聚焦搜索栏。希望能得到帮助。

    我比较了在viewWillAppearviewDidAppear 中调用成为第一响应者,它只有在你在viewWillAppear 中调用时才有效。但我不太明白为什么会这样。这可能是您无法在搜索栏中输入任何内容的原因。

    PS:我认为viewDidAppear 内部不需要您的DispatchQueue.main.async。它总是在主队列中被调用。

    //
    //  TestSearchbarFocus.swift
    //  SwiftPlayground
    //
    //  Created by Enix Yu on 31/10/2016.
    //  Copyright © 2016 RobotBros. All rights reserved.
    //
    
    import UIKit
    
    
    class TestSearchbarFocus: UITableViewController, UISearchResultsUpdating {
    
        var searchController : UISearchController!
    
        let data = ["ABC", "BBC", "CCD", "Enix", "Peter", "Earth"]
        var displayData = [String]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            searchController = UISearchController(searchResultsController: nil)
            searchController.searchResultsUpdater = self
            searchController.dimsBackgroundDuringPresentation = false
            searchController.hidesNavigationBarDuringPresentation = false
            definesPresentationContext = true
            navigationItem.titleView = searchController.searchBar
        }
    
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
    
            searchController.active = true
            searchController.searchBar.becomeFirstResponder()
        }
    
        func filterDataForSearchText(text: String){
            displayData = data.filter({
                (item) -> Bool in
                item.lowercaseString.containsString(text.lowercaseString)
            })
    
            tableView.reloadData()
        }
    
        func updateSearchResultsForSearchController(searchController: UISearchController) {
            filterDataForSearchText(searchController.searchBar.text!)
        }
    
        // MARK : UITableViewDataSource/Delegate
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if searchController.active && searchController.searchBar.text != "" {
                return displayData.count
            }
    
            return data.count
        }
    
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
            if searchController.active && searchController.searchBar.text != "" {
                cell.textLabel?.text = displayData[indexPath.row]
            } else {
                cell.textLabel?.text = data[indexPath.row]
            }
            return cell
        }
    }
    

    PS:我使用的是 swift 2 + Xcode 7.3.1

    【讨论】:

    • 不幸的是,它在我的情况下不起作用。不知道为什么。
    • 您是否尝试过将代码移入viewWillAppear
    • 是的。还是行不通。我现在知道问题所在了。因为我的视图控制器不是根视图控制器。它由根视图控制器推送。但我不知道如何解决它。
    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多