加载视图时,让我的UISearchBar自动获得焦点

时间:2016-10-31 04:58:09

标签: ios swift3 uisearchbar

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

enter image description here

我想让它在我的视图加载时自动聚焦。我尝试了几种基于this question的方法。但没有一个工作。我必须点击搜索栏才能集中注意力。

enter image description here

这是我的代码之一:

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
    }
}

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

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分: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放入主队列,否则键盘将不会自动显示。

答案 1 :(得分:0)

只要出现以下代码,我就可以将搜索栏对焦。希望能有所帮助。

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

PS:我认为DispatchQueue.main.async内没有必要viewDidAppear。它总是在主队列中调用。

//
//  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