加载UISearchController时自动显示键盘

时间:2015-06-28 23:21:02

标签: ios swift uisearchcontroller

我在表视图控制器中创建了一个UISearchController。我使用来自另一个视图控制器的push segue来查看此表视图控制器。我希望一旦按下表视图控制器,键盘就会在搜索栏中显示光标。

我使用

在viewDidLoad方法中激活了搜索控制器
self.mySearchController.active = true

它确实使搜索控制器处于活动状态,但这不会调出键盘,光标也不会放在搜索栏中。我也试过

self.mySearchController.searchBar.becomeFirstResponder()

此行似乎没有任何效果。

如何自动/以编程方式调出键盘?以下是我的代码的更详细版本

class PickAddressViewController: UITableViewController, UISearchResultsUpdating {

var searchText = ""

var mySearchController = UISearchController()

override func viewDidLoad() {
    super.viewDidLoad()

    self.mySearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        controller.searchBar.sizeToFit()
        controller.searchBar.text = self.searchText

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    self.mySearchController.active = true
    self.mySearchController.searchBar.becomeFirstResponder()
}

6 个答案:

答案 0 :(得分:4)

BecomeFirstResponder是要走的路,但你不应该在viewDidLoad中这样做。有关详细信息,请参阅以下讨论 - Cannot set searchBar as firstResponder

答案 1 :(得分:3)

我也尝试过Nikita Leonov提到的链接中列出的建议。我需要将类添加为UISearchControllerDelegate& UISearchBarDelegate,然后它工作。我不是你

class PickAddressViewController: UITableViewController, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.mySearchController = ({
            controller.searchBar.delegate = self
        })()

        self.mySearchController.active = true
        self.mySearchController.delegate = self
    }

    func didPresentSearchController(searchController: UISearchController) {
        self.mySearchController.searchBar.becomeFirstResponder()
    }
    …
}

答案 2 :(得分:2)

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)
    self.navigationItem.titleView = searchController!.searchBar
    dispatch_async(dispatch_get_main_queue(), {
        self.searchController?.active = true
        self.searchController!.searchBar.becomeFirstResponder()
    })
}

和此代码

func presentSearchController(searchController: UISearchController) {
    searchController.searchBar.becomeFirstResponder()
}

确保你给予 viewDidLoad()中的searchController?.delegate = self。在iOS 9. *设备上测试

答案 3 :(得分:1)

在我的案例中,

Swift 3解决方案:

override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.titleView = mySearchController.searchBar
    mySearchController.searchResultsUpdater = self
    mySearchController.delegate = self

}

override func viewDidAppear(_ animated: Bool) {
    DispatchQueue.main.async {
        self.mySearchController.isActive = true
    }
}

func presentSearchController(_ searchController: UISearchController) {
    mySearchController.searchBar.becomeFirstResponder()
}

答案 4 :(得分:0)

除了做其他用户建议的内容外,我还做了以下工作,并且有效:

searchController.definesPresentationContext = true

答案 5 :(得分:0)

雨燕5

  1. viewDidLoad中:
searchViewController.delegate = self
  1. viewDidAppear中:
searchViewController.isActive = true

这将激活SearchController

  1. 定义委托方法:
extension MyViewController: UISearchControllerDelegate {
    func didPresentSearchController(_ searchController: UISearchController) {
        DispatchQueue.main.async {
            searchController.searchBar.becomeFirstResponder()
        }
    }
}
相关问题