2016-04-21 56 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没有被调用的原因是什么? –