我试图使用UISearchController,但我遇到了保留问题,我不能解决。MainTableview有两个部分。
第一节
基于某些正则表达式的过滤数据
第二节
所有数据
我将UISearchController添加到我的tableview中,并将ResultsTableController作为resultsTableController附加。当用户搜索某些内容时,ResultsTableController会出现,因为我将tableview委托设置为self,所以从ResultsTableController中选择项会调用我的MainTableViewController中的didSelectRowAtIndexPath。但是,如果用户从resultsTableController中选择某些内容,则会出现分配问题。
以下情况适用于不同的场景
- 用户不搜索任何内容,只是从MainTableview中选择一个项目,我看到deinit消息
- 用户搜索某些内容,取消搜索,从MainTableview中选择项目,我看到deinit消息
- 用户搜索一些东西,并从ResultsTableController中选择一个项目,我在我的视图控制器中没有得到deinit
MainTableViewController.swift
var searchController: UISearchController!
// Secondary search results table view.
var resultsTableController: ResultsTableController!
var allCompanies = ["Data1","Data2","Data3"]
override func viewDidLoad() {
super.viewDidLoad()
resultsTableController = ResultsTableController()
// We want to be the delegate for our filtered table so didSelectRowAtIndexPath(_:) is called for both tables.
resultsTableController.tableView.delegate = self
searchController = UISearchController(searchResultsController: resultsTableController)
searchController.searchResultsUpdater = self
searchController.searchBar.sizeToFit()
tableView.tableHeaderView = searchController.searchBar
searchController.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.delegate = self
definesPresentationContext = true
}
}
// MARK: UISearchBarDelegate
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
// MARK: UISearchResultsUpdating
func updateSearchResultsForSearchController(searchController: UISearchController) {
// Update the filtered array based on the search text.
let filteredResults = allCompanies.filter({ company in
(company.lowercaseString as NSString).containsString(searchController.searchBar.text.lowercaseString)
})
// Hand over the filtered results to our search results table.
let resultsController = searchController.searchResultsController as! ResultsTableController
resultsController.searchResult = filteredResults
resultsController.tableView.reloadData()
}
// usual tableview methods
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if resultsTableController.searchResult.count > 0 {
selectedCompany = resultsTableController.searchResult[index]
//do something with selected company
navigationController?.popViewControllerAnimated(true)
return
}
//
selectedCompany = allCompanies[index]
navigationController?.popViewControllerAnimated(true)
}
deinit {
println("MainTableView deinit")
}
字符串
ResultTableController.swift
class ResultsTableController:UITableViewController {
var searchResult = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResult.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
let index = indexPath.row
cell.textLabel?.font = UIFont(name: "Avenir-Roman", size: 16)
cell.textLabel?.text = searchResult[index].description
return cell
}
deinit {
println("ResultTableController deinit")
}
}
型
3条答案
按热度按时间hlswsv351#
嘿,我今天遇到了这个问题,显然我需要强制解雇searchController来解决保留问题
字符串
下面是我示例项目https://www.dropbox.com/s/zzs0m4n9maxd2u5/TestSearch.zip?dl=0
6qqygrtg2#
解决方案似乎是在某个时候在UISearchController上调用dismissViewControllerAnimated。大多数人可能不会这样做,因为UISearchController在某种程度上是与托管UISearchController的视图控制器相关的实现细节。
我的解决方案,无论你如何呈现你的搜索UI(标准呈现或在弹出框中),似乎都能工作,在检查视图控制器是否不再呈现后,从你的主机的viewDidDisappear调用searchController.dismissViewControllerAnimated()。这可以捕获所有情况,尤其是弹出框情况,即用户在弹出框外点击以自动关闭UI,或者搜索UI消失的情况,仅仅是因为您将其他内容推到导航堆栈上。在后一种情况下,您不希望解除UISearchController。
字符串
ijxebb2r3#
字符串