Xcode UISearchController未更新
我在ios8和swift中使用xcode 6.2进行开发,我试图在UITableViewController中实现一个UISearchController,该控制器可以在搜索后进行更新,我编写了一些简单的代码只是为了检查它是否有效,但是当我编译时,搜索栏就在那里,但是当我输入文本并点击搜索时,什么都没有发生: 这是我的密码:Xcode UISearchController未更新,xcode,swift,ios8,uisearchcontroller,Xcode,Swift,Ios8,Uisearchcontroller,我在ios8和swift中使用xcode 6.2进行开发,我试图在UITableViewController中实现一个UISearchController,该控制器可以在搜索后进行更新,我编写了一些简单的代码只是为了检查它是否有效,但是当我编译时,搜索栏就在那里,但是当我输入文本并点击搜索时,什么都没有发生: 这是我的密码: import UIKit class searchresult: UITableViewController,UISearchBarDelegate, UISearchC
import UIKit
class searchresult: UITableViewController,UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating {
var result:[String] = ["a","b","c"]
override func viewDidLoad() {
super.viewDidLoad()
var searchcon = UISearchController(searchResultsController: self)
searchcon.delegate = self
searchcon.searchBar.delegate = self
searchcon.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchcon.searchBar
searchcon.searchResultsUpdater = self
searchcon.searchBar.showsSearchResultsButton = true
self.definesPresentationContext = true
searchcon.dimsBackgroundDuringPresentation = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
cell.textLabel!.text = result[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return result.count
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
println("updating")
result = ["1"]
self.tableView.reloadData()
}
}
请将此代码与其他内容一起使用
class searchresult: UITableViewController {
var searchcon = UISearchController(searchResultsController: nil)
searchcon.searchResultsUpdater = self
searchcon.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchcon.searchBar
searchcon.searchBar.showsSearchResultsButton = true
self.definesPresentationContext = true
searchcon.dimsBackgroundDuringPresentation = false
}
正如Praveen Gowda IV所说,您需要将
searchResultsController
从self
更改为nil
。您还需要在viewDidLoad
外部声明您的searchcon
:
var searchcon = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
// your implementation
}
但是,您得到的行为可能不是您想要的,因为在搜索之前会调用updateSearchResultsForSearchController
:
当搜索栏成为第一响应者或
用户在搜索栏内进行更改。()
正如我在评论中所建议的,在初始化
UISearchController
时,您需要将self
更改为null
override func viewDidLoad() {
super.viewDidLoad()
var searchcon = UISearchController(searchResultsController: nil)
searchcon.delegate = self
searchcon.searchBar.delegate = self
searchcon.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchcon.searchBar
searchcon.searchResultsUpdater = self
searchcon.searchBar.showsSearchResultsButton = true
self.definesPresentationContext = true
searchcon.dimsBackgroundDuringPresentation = false
}
用户3694363所说的关于在文本更改之前调用搜索控制器的updateSearchResultsForSearchController
的内容是正确的。但是当它成为第一响应者时,您可以遵循下面的技巧来防止做任何事情
func updateSearchResultsForSearchController(searchController: UISearchController) {
// No need to update anything if we're being dismissed.
if !searchController.active {
return
}
// do the filtering here
}
只需在
var searchcon=UISearchController(searchresultcontroller:self)
中尝试将self
更改为nil
,因为它试图创建一个新的searchresultcontroller
来显示结果这是可行的,但我不完全理解为什么必须在外部视图上初始化searchon,你能解释一下吗?对不起,我的意思是“申报”,而不是“草签”。您的代码无法工作,因为。一旦viewdide出现
完成,它就会删除您的searchcon
,因此当有东西更新对象时,它就消失了。要检查这一点,请创建UISearchController
的子类,并实现deinit
方法,以便打印消息。使searchcon
成为该子类的实例。现在,您可以轻松了解对象何时死亡。