2016-10-31 45 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在主隊列,否則鍵盤將不會自動顯示。