2016-04-21 63 views
0

我正在嘗試使用UISearchBar編寫簡單的UITableView。當我拖放一個UITableViewController時,我沒有問題。一切正常! (見下面的代碼)iOS中未調用updateSearchResultsForSearchController 9

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.searchResultsController = UISearchController(searchResultsController: nil) //initialize the search controller 
    self.searchResultsController.searchResultsUpdater = self //the search controller updater is this view 
    self.searchResultsController.dimsBackgroundDuringPresentation = false 
    self.searchResultsController.searchBar.sizeToFit() 
    self.searchResultsController.searchBar.searchBarStyle = UISearchBarStyle.Minimal 
    self.searchResultsController.searchBar.showsCancelButton = true 

    self.tableView.tableHeaderView = searchResultsController.searchBar 
    self.tableView.reloadData() 
} 

但現在,爲了實驗的目的,我用UIViewController,並且加入了UITableView,沒有問題顯示在表我的記錄。

然後,從故事板中添加一個UISearchBar,將其委託設置爲UIViewController,但當用戶輸入某些東西時,不調用updateSearchResultsForSearchController方法。

這就像我的UISearchController不知道有一個UISearchBar,並且我輸入什麼,並沒有喚起更新方法。我必須告訴UISearchController,嘿,這是你的UISearchBar

所以這裏是頂部的我的代碼:

class SearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate 

{

@IBOutlet weak var mySearchBar: UISearchBar! 
@IBOutlet weak var myViewTable: UITableView! 

let allElements = ["H", "Li", "Na", "K", "Rb", "Cs", "Fr"] 
var filteredElemetns = [String]() 
var searchResultsController = UISearchController() //create a new search controller 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    self.searchResultsController = UISearchController(searchResultsController: nil) //initialize the search controller 
    self.searchResultsController.searchResultsUpdater = self //the search controller updater is this view 
    self.searchResultsController.dimsBackgroundDuringPresentation = false 
    self.searchResultsController.searchBar.sizeToFit() 
    self.searchResultsController.searchBar.searchBarStyle = UISearchBarStyle.Minimal 
    self.searchResultsController.searchBar.delegate = self 

    //self.myViewTable.tableHeaderView = self.searchResultsController.searchBar 
} 

如果我去掉最後一行,那麼我將有兩個UISearchBar,其中之一是由故事板和補充另一個用最後一行代碼。我添加的那個,不起作用,但在myViewTable的頂部。

+1

你的類是否符合UISearchResultsUpdating,UISearchControllerDelegate協議? – MDB983

+0

missing searchController.searchBar.delegate = self? –

+0

是的,它符合。 –

回答

1

好的,我找到了解決方案。

我在searchBar:textDidChange函數中使用了我的過濾算法。然後一切正常,我不再需要updateSearchResultsForSearchController函數。這裏是我的代碼:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) 
{ 
    print("filtering...") 
    self.filteredElemetns.removeAll(keepCapacity: false) //remove all the elements 

    let searchPredict = NSPredicate(format: "SELF CONTAINS [c] %@", self.mySearchBar.text!) 

    print(searchPredict) 

    let foundElements = (self.allElements as NSArray).filteredArrayUsingPredicate(searchPredict) 

    self.filteredElemetns = foundElements as! [String] 

    self.myViewTable.reloadData() 
} 

當然,不要忘記,以確保你的類符合UISearchBarDelegate協議。

我發現這種方法比使用UITableViewController更好。一個原因,如果你搜索,你會發現很多人在第一響應者做出UISearchBar時遇到問題。我發現唯一的解決辦法是在延遲之後調用becomeFirstResponder,這實際上不是一個好的編程方法。

但是,使用這種方法,您可以使您的UISearchBar的插座,然後很容易使其成爲viewDidAppear第一響應者。

我知道有些人可能會說,不,你可以很容易地使UISearchBar的第一個響應者,即使你使用UISearchResultsController做一樣的東西:

self.searchResultsController.searchBar.becomeFirstResponder() 
self.searchResultsController.active = true 

但相信我,在iOS的8/9是不是簡單,它不會工作。試試吧......

+4

那麼updateSearchResultsForSearchController沒有被調用的原因是什麼? –

相關問題