swift UISearchController保留问题

ee7vknir  于 2023-08-02  发布在  Swift
关注(0)|答案(3)|浏览(96)

我试图使用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")
    }
}

hlswsv35

hlswsv351#

嘿,我今天遇到了这个问题,显然我需要强制解雇searchController来解决保留问题

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    searchController?.dismissViewControllerAnimated(false, completion: nil)
  }

字符串
下面是我示例项目https://www.dropbox.com/s/zzs0m4n9maxd2u5/TestSearch.zip?dl=0

6qqygrtg

6qqygrtg2#

解决方案似乎是在某个时候在UISearchController上调用dismissViewControllerAnimated。大多数人可能不会这样做,因为UISearchController在某种程度上是与托管UISearchController的视图控制器相关的实现细节。
我的解决方案,无论你如何呈现你的搜索UI(标准呈现或在弹出框中),似乎都能工作,在检查视图控制器是否不再呈现后,从你的主机的viewDidDisappear调用searchController.dismissViewControllerAnimated()。这可以捕获所有情况,尤其是弹出框情况,即用户在弹出框外点击以自动关闭UI,或者搜索UI消失的情况,仅仅是因为您将其他内容推到导航堆栈上。在后一种情况下,您不希望解除UISearchController。

override func viewDidDisappear(animated: Bool)
{
    super.viewDidDisappear(animated)

    if presentingViewController == nil
    {
        searchController.dismissViewControllerAnimated(false, completion: nil)
    }
}

字符串

ijxebb2r

ijxebb2r3#

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if searchController.isActive {
        searchController.isActive = false
    }
}

字符串

相关问题