【发布时间】: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。希望这能给您带来指导。