2015-09-06 2 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-09-07 00: 02: 46,116 TableViewSearch [2415: 68217] Попытка загрузить мнение в целях контроллер, пока он deallocating не допускается и может привести к непредсказуемому поведению()

Любые идеи, как это исправить?

+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

Мне просто нужно было добавить этот код в viewDidLoad() перед тем, как получить доступ к результатуSearchController & он работал –

+0

Вы спасли мой день! – Emptyless

Смежные вопросы