在iOS 9

时间:2016-04-21 13:51:14

标签: ios swift uitableview uisearchbar uisearchcontroller

我正在尝试使用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顶部的那个起作用。

1 个答案:

答案 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中并不是那么简单,它不会起作用。试试吧......