2016-10-31 46 views
0

这是我用的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() 
    } 
} 

有人提到becomeFirstResponder后searchController应该是积极的。我试过这个:

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

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

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

有什么想法?谢谢。

+0

您是否尝试过在没有调试器的情况下运行它? –

+0

是您在导航栏中的搜索栏吗? –

+0

你在设备上测试过吗?有时在模拟器上键盘被CMD + K隐藏。 – kamwysoc

回答

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

+0

不幸的是,它不适用于我的情况。不知道为什么。 –

+0

你有没有试过移动'viewWillAppear'里面的代码。 – Enix

+0

是的。还是行不通。 我现在知道这个问题。因为我的视图控制器不是根视图控制器。它由根视图控制器推送。但我不知道如何解决它。 –

0

我遵循的建议,并重新创建我的项目。它的作品。我的代码:

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在主队列,否则键盘将不会自动显示。