Xcode 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

我在ios8和swift中使用xcode 6.2进行开发,我试图在UITableViewController中实现一个UISearchController,该控制器可以在搜索后进行更新,我编写了一些简单的代码只是为了检查它是否有效,但是当我编译时,搜索栏就在那里,但是当我输入文本并点击搜索时,什么都没有发生:

这是我的密码:

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
成为该子类的实例。现在,您可以轻松了解对象何时死亡。