【问题标题】:Attempting to load the view of a view controller while it is deallocating在解除分配时尝试加载视图控制器的视图
【发布时间】:2015-09-06 23:14:05
【问题描述】:

我正在学习使用搜索栏和数据过滤来实现 TableView。所以,我的storyboard 中有以下内容:

我的UITableViewController 像这样连接到以下SearchTableViewController.swift 类:

import UIKit

class SearchTableViewController: UITableViewController, UISearchResultsUpdating {

    // table view controller properties
    let appleProducts = ["Mac", "iPhone", "Apple Watch", "iMac", "iPad"]
    var filteredAppleProducts = [String]()
    var resultSearchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Configure result search controller
        self.resultSearchController = UISearchController(searchResultsController: nil)
        self.resultSearchController.searchResultsUpdater = self
        self.resultSearchController.dimsBackgroundDuringPresentation = false
        self.resultSearchController.searchBar.sizeToFit()
        self.resultSearchController.searchBar.placeholder = "Search Products"
        self.tableView.tableHeaderView = self.resultSearchController.searchBar
        self.tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (self.resultSearchController.active) {
            return self.filteredAppleProducts.count
        } else {
            return self.appleProducts.count
        }
    }

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

        if (self.resultSearchController.active) {
            cell.textLabel?.text = self.filteredAppleProducts[indexPath.row]
        } else {
            cell.textLabel?.text = self.appleProducts[indexPath.row]
        }

        return cell
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        self.filteredAppleProducts.removeAll(keepCapacity: false)
        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let resultArray = (self.appleProducts as NSArray).filteredArrayUsingPredicate(searchPredicate)
        self.filteredAppleProducts = resultArray as! [String]
        self.tableView.reloadData()
    }

}

这运行良好,过滤按预期工作:

但是,当应用程序在模拟器中运行时,我在调试窗口中收到以下警告:

2015-09-07 00:02:46.116 TableViewSearch[2415:68217] 正在尝试加载 视图控制器在释放时的视图是不允许的 并可能导致未定义的行为()

任何想法如何解决这个问题?

【问题讨论】:

  • TableViewSearch 到底是什么?
  • @ILikeTau 它是 XCode 中项目/应用程序的名称。
  • 您要展示新的控制器吗?我的猜测是它试图再次呈现这个控制器或类似的东西......你能添加更多代码吗?
  • 我收到了这条消息。我的原因是堆栈中有太多导航控制器。现在,对于每个故事板,我都有一个导航。初始 ViewController 的控制器,但该情节提要中没有其他 NC。希望这能给您带来指导。

标签: ios xcode swift ios9


【解决方案1】:

我也花了一整天的时间来理解这个问题......有人说这与导航控制器问题有关,其他人说这是一个小故障。虽然这可能不是正确的答案,但希望我能给出一些提示。如果您认为这不是正确的方法,请告诉我。谢谢。 我的情况如下(我认为是因为不同的设计。)

var resultSearchController: UISearchController!()

然后,我必须在下面添加。

self.resultSearchController.loadViewIfNeeded()

【讨论】:

  • 我只需要在 viewDidLoad() 中添加这段代码,然后再访问 resultSearchController 就可以了
【解决方案2】:

只需更改以下行

var resultSearchController = UISearchController()

到下一行

var resultSearchController:UISearchController!

您的其余代码没有问题。只需要进行一项更改。

如果你想看详细解释,请查看我的tutorial on UISearchController

【讨论】:

  • 谢谢。这解决了我的约束问题。
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多