2015-09-06 50 views
3

我正在學習實現帶有搜索欄和數據過濾的TableView。所以,我在我的storyboard如下:試圖加載視圖控制器的視圖,而它正在釋放

enter image description here

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() 
    } 

} 

這運行正常和過濾按預期工作:

enter image description here

然而,w應用程序被在模擬器運行母雞,我得到在調試窗口以下警告:

2015年9月7日00:02:46.116 TableViewSearch [2415:68217]試圖加載 一個視圖的視圖控制器,而它正在釋放是不允許的 並可能導致未定義的行爲()

任何想法如何解決這個問題?

+0

究竟是什麼'TableViewSearch'? –

+0

@ILikeTau它是XCode中項目/應用程序的名稱。 – Latheesan

+0

你提出了一個新的控制器?我的猜測是它試圖再次展示這個控制器或類似的東西......你能添加更多的代碼嗎? –

回答

1

以下行

var resultSearchController = UISearchController() 

只是更改爲以下行

var resultSearchController:UISearchController! 

你的代碼的其餘部分就可以了。只有這一個變化是必需的。

如果你想看到那麼詳細的解釋檢查我tutorial on UISearchController

+0

謝謝。這解決了我的約束問題。 – Pangu

6

我花了一整天太理解這個問題......有人說,它涉及到導航控制器的問題,有人說這是一個小故障。雖然這可能不是正確的答案,但希望我能給出一些提示。如果您認爲這不是一個正確的方法,請告訴我。謝謝。 我的情況是不是如下(由於不同的設計,我想。)

var resultSearchController: UISearchController!() 

於是,我只好下面添加。

self.resultSearchController.loadViewIfNeeded() 
+0

我只需要在訪問resultSearchController之前在viewDidLoad() 中添加此代碼,它工作 –

+0

您節省了我的一天! – Emptyless

相關問題