【问题标题】:ViewWillDisappear not getting called searchcontrollerViewWillDisappear 没有被调用 searchcontroller
【发布时间】:2015-07-27 15:39:19
【问题描述】:

当我在搜索过程中然后切换 UItabs 时,不会调用 ViewWillDisappear。知道为什么当我过滤结果显示和切换标签时 ViewWillDisappear 没有被调用?

func updateSearchResultsForSearchController(searchController: UISearchController) {
  if self.searchController?.searchBar.text.lengthOfBytesUsingEncoding(NSUTF32StringEncoding) > 0 {
        if let results = self.results {
            results.removeAllObjects()
        } else {
            results = NSMutableArray(capacity: MyVariables.dictionary.keys.array.count)
        }

        let searchBarText = self.searchController!.searchBar.text

        let predicate = NSPredicate(block: { (city: AnyObject!, b: [NSObject : AnyObject]!) -> Bool in
            var range: NSRange = NSMakeRange(0, 0)
            if city is NSString {

                range = city.rangeOfString(searchBarText, options: NSStringCompareOptions.CaseInsensitiveSearch)
            }

            return range.location != NSNotFound
        })

        // Get results from predicate and add them to the appropriate array.
        let filteredArray = (MyVariables.dictionary.keys.array as NSArray).filteredArrayUsingPredicate(predicate)
        self.results?.addObjectsFromArray(filteredArray)


        // Reload a table with results.
        self.searchResultsController?.tableView.reloadData()
    }
}




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(self.identifier) as! UITableViewCell

    var text: String?
    var imgtext:AnyObject?
    if tableView == self.searchResultsController?.tableView {
        if let results = self.results {
            text = self.results!.objectAtIndex(indexPath.row) as? String
           imgtext = MyVariables.dictionary[text!]
            let decodedData = NSData(base64EncodedString: imgtext! as! String, options: NSDataBase64DecodingOptions(rawValue: 0) )
            var decodedimage = UIImage(data: decodedData!)


            cell.imageView?.image = decodedimage
        }
    } else {
        text = MyVariables.dictionary.keys.array[indexPath.row] as String
    }

    cell.textLabel!.text = text


    return cell
}

满载而归

  override func viewDidLoad() {
    super.viewDidLoad()

    let resultsTableView = UITableView(frame: self.tableView.frame)
    self.searchResultsController = UITableViewController()
    self.searchResultsController?.tableView = resultsTableView
    self.searchResultsController?.tableView.dataSource = self
    self.searchResultsController?.tableView.delegate = self

    // Register cell class for the identifier.
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: self.identifier)
    self.searchResultsController?.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: self.identifier)

    self.searchController = UISearchController(searchResultsController: self.searchResultsController!)
    self.searchController?.searchResultsUpdater = self
    self.searchController?.delegate = self
    self.searchController?.searchBar.sizeToFit()
    self.searchController?.hidesNavigationBarDuringPresentation = false;
    self.tableView.tableHeaderView = self.searchController?.searchBar
    self.definesPresentationContext = true

}

【问题讨论】:

  • 您正在检查哪个视图控制器的 viewWillDisappear?主表视图控制器,还是 searchResultsController?
  • @pbasdf UITableViewController
  • @user5130344.. 我也遇到了同样的问题?你找到解决办法了吗?

标签: ios objective-c xcode swift


【解决方案1】:

有同样的问题。 viewWillDisappear 不是在UITableViewController 上调用的,而是在UISearchController 上调用的。

所以我继承了UISearchController 并覆盖了viewWillDisappear 方法。在我的情况下,我只需要停用搜索控制器。

class SearchController: UISearchController {

    override func viewWillDisappear(_ animated: Bool) {        
        // to avoid black screen when switching tabs while searching
        isActive = false
    }
}

【讨论】:

    【解决方案2】:

    类似于@user5130344,我发现子类化解决了我的问题,尽管我发现 isActive = false 清除了我希望搜索查询在返回视图时保留的搜索栏。

    这是我的子类 - 这解决了我在 iOS 13 中关闭父视图的问题:

    class MySearchController: UISearchController {
    
        override func viewWillDisappear(_ animated: Bool) {
            // to avoid black screen when switching tabs while searching
            self.dismiss(animated: true)
        }
    }
    

    【讨论】:

      【解决方案3】:

      我认为这是 xcode 的问题。尝试关闭它并再次重新打开项目并尝试再次运行

      【讨论】:

      • 这不是 xcode,我已经重新编译了几次并关闭了 xcode 并重新打开了数十次......我的代码中有一些东西不允许页面被释放,我可以'不知道它是什么
      • 尝试注释掉您觉得有点可疑的代码(例如:与搜索相关的代码),然后尝试在选项卡之间导航并查看问题仍然存在,因为我无法找到问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多