我正在尝试使用UITableView
编写一个简单的UISearchBar
。拖放UITableViewController
时我没有问题。一切正常! (见下面的代码)
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
顶部的那个起作用。
答案 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中并不是那么简单,它不会起作用。试试吧......