【问题标题】:Show keyboard automatically when UISearchController is loaded加载 UISearchController 时自动显示键盘
【发布时间】:2020-10-11 01:26:26
【问题描述】:

我在表格视图控制器中创建了一个 UISearchController。我使用来自另一个视图控制器的 push segue 连接到这个表视图控制器。一旦按下表格视图控制器,我希望键盘在搜索栏中显示光标。

我使用

在 vi​​ewDidLoad 方法中激活了搜索控制器
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()
}

【问题讨论】:

    标签: ios swift uisearchcontroller


    【解决方案1】:

    BecomeFirstResponder 是要走的路,但你不应该在 viewDidLoad 中这样做。详情请看以下讨论 - Cannot set searchBar as firstResponder

    【讨论】:

    • 太棒了!我尝试了该链接中的解决方案并且它有效!对于像我这样的任何其他新手,除了我在上面的问题中编写的代码之外,您还必须执行以下操作:使视图控制器成为 UISearchControllerDelegate。在定义搜索控制器时,写一行 controller.delegate = self。将 becomeFirstResponder 行放在名为 'didPresentSearchController' 的委托函数中
    【解决方案2】:

    我还尝试了 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()
        }
        …
    }
    

    【讨论】:

      【解决方案3】:

      斯威夫特 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()
              }
          }
      }
      

      【讨论】:

      • 我正在尝试这种方法,但采用了不同的方法。所以我点击我的搜索控制器,然后从那里推送到一个新的视图控制器,当我返回时,我希望我的键盘可见。现在一切看起来都被调用了,但我的键盘不可见。我必须再次点击 UISearchController 搜索栏以使其可见。有什么建议吗?
      • 这很完美,并且在视图控制器出现后实际上会打开键盘。
      【解决方案4】:

      就我而言,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()
      }
      

      【讨论】:

        【解决方案5】:
        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()
        }
        

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

        【讨论】:

          【解决方案6】:

          除了按照其他用户的建议做之外,我还做了以下事情,并且成功了:

          searchController.definesPresentationContext = true

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-26
            • 1970-01-01
            • 2023-03-21
            • 2019-11-16
            • 1970-01-01
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多