【发布时间】:2017-08-27 21:40:00
【问题描述】:
我正在尝试搜索从 Firebase 数据库中提取的对象数组。数据加载正常,但是当我尝试搜索时没有显示。我现在才学习 iOS/Swift 开发大约 6 周。下面是我的代码。
我一点击搜索栏,应用就崩溃了。 我设法让搜索代码停止崩溃,但我的搜索没有任何回报。这是因为我正在搜索 Firebase 数据库吗?我正在将 firebase 数据加载到一个数组中,所以它应该是可搜索的吧?
import UIKit
import Firebase
class ServicesTableViewController: UITableViewController, UISearchResultsUpdating {
var services = [Service]()
var filteredSearch = [Service]()
var searchController: UISearchController!
var resultsController = UITableViewController()
override func viewDidLoad() {
super.viewDidLoad()
// Turn this back on to cache data
FIRDatabase.database().persistenceEnabled = true
fetchServices()
self.resultsController.tableView.dataSource = self
self.resultsController.tableView.delegate = self
self.searchController = UISearchController(searchResultsController: self.resultsController)
self.tableView.tableHeaderView = searchController.searchBar
self.searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search services..."
searchController.searchBar.tintColor = UIColor.white
searchController.searchBar.barTintColor = UIColor(red: 164.0/255.0, green: 45.0/255.0, blue: 9.0/255.0, alpha: 1.0)
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
// MARK: - Search Controller
func filterContent(for searchText: String) {
filteredSearch = services.filter({ (service) -> Bool in
if let name = service.name {
let isMatch = name.localizedCaseInsensitiveContains(searchText)
return isMatch
}
return false
})
}
func updateSearchResults(for searchController: UISearchController) {
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
tableView.reloadData()
}
}
// MARK: Database connection and data fetch
func fetchServices () {
FIRDatabase.database().reference().child("services").observe(.childAdded, with: { (snapshot) in
print(snapshot)
if let dictionary = snapshot.value as? [String: AnyObject] {
let service = Service()
service.setValuesForKeys(dictionary)
self.services.append(service)
self.tableView.reloadData()
}
})
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.isActive {
return filteredSearch.count
} else {
return services.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ServicesTableViewCell
// Check to see if the user is searching or not
let service = (searchController.isActive) ? filteredSearch[indexPath.row] : services[indexPath.row]
// let service = services[indexPath.row]
cell.programLabel.text = service.name
cell.programLabel.font = UIFont(name: "Avenir-Medium", size: 18.0)
cell.programLabel.textColor = UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0)
cell.branchLabel.text = service.branch
cell.branchLabel.font = UIFont(name: "Avenir-Medium", size: 14.0)
cell.branchLabel.textColor = UIColor(red: 90.0/255.0, green: 86.0/255.0, blue: 92.0/255.0, alpha: 1.0)
cell.servicesLabel.text = service.shortDesc
cell.servicesLabel.font = UIFont(name: "Avenir-Light", size: 14.0)
cell.servicesLabel.textColor = UIColor(red: 164.0/255.0, green: 45.0/255.0, blue: 9.0/255.0, alpha: 1.0)
cell.thumbnailImageView.image = UIImage(named: service.imageName!)
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showServicesDetail" {
if let indexPath = tableView.indexPathForSelectedRow {
let destinationController = segue.destination as! ServicesDetailViewController
destinationController.services = services[indexPath.row]
}
}
}
}
这是我当前的故事板。只有两个视图和一个导航控制器, enter image description here
【问题讨论】:
-
因为
services.filter将返回Service的数组,但filteredSearch是String的数组。为什么不var filteredSearch = [Service]()? -
您需要向我们展示您的
Service班级 -
非常感谢您的建议。我对 var filteredSearch = [Service]() 进行了更改,但出现错误无法将(字符串)-> Bool 的值转换为预期的参数类型(服务)-> Bool。
-
这是我制作的课程。文件名 "Service.swift" 导入 UIKit 类 Service: NSObject { var name: String? var 分支:字符串? var shortDesc:字符串? var longDesc:字符串? var imageName:字符串? var mainPhone:字符串? var 位置:字符串? var hours:字符串? var 网站:字符串? }
-
我正在使用此链接中的教程。在我制作自定义课程之前工作得很好。 youtube.com/watch?v=XtiamBbL5QU
标签: arrays swift object search