Итак, я сделал приложение для iOS, и у меня есть выборки местоположений из базы данных Firebase в реальном времени, и при асинхронной загрузке местоположения загружаются в табличное представление, и мне нужна строка поиска, чтобы правильно сопоставить название местоположения с выбранным пользователем прикосновением. Проблема заключается в том, что после всех асинхронных загрузок поиск правильно сопоставляет ключевые слова с именем местоположения, но когда пользователь щелкает, он фактически открывает другое местоположение, как будто исходное табличное представление находится внизу, а затем результаты поиска представляют собой слой. отображается поверх оригинала, и когда пользователь нажимает на слой, он фактически открывает исходное местоположение под слоем
Я не могу понять, почему, возможно, мне нужно создать второе табличное представление для поиска, но я не понимаю, почему оно открывает нижний слой результатов поиска.
searchCell
:
import Foundation
import UIKit
class searchCell: UITableViewCell {
@IBOutlet weak var nameTextLabel: UILabel!
@IBOutlet weak var locationTextLabel: UILabel!
func setData(data: NightClubs) {
nameTextLabel.text = data.name
locationTextLabel.text = data.location
}
}
MasterViewController
:
import Foundation
import UIKit
import FirebaseDatabase
class MasterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableView: UITableView!
@IBOutlet var searchFooter: SearchFooter!
let searchController = UISearchController(searchResultsController: nil)
var detailViewController: DetailViewController? = nil
var filteredNightClubs = [NightClubs]()
var nightClubs = [NightClubs]()
var smallerNightClubs = [NightClubs]()
var tempImage = #imageLiteral(resourceName: "Your Club Here")
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
dataService()
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search NightClubs"
navigationItem.searchController = searchController
definesPresentationContext = true
searchController.searchBar.scopeButtonTitles = ["All", "Barrie", "Toronto", "London"]
searchController.searchBar.delegate = self
tableView.tableFooterView = searchFooter
}
override func viewWillAppear(_ animated: Bool) {
if let selectionIndexPath = self.tableView.indexPathForSelectedRow {
self.tableView.deselectRow(at: selectionIndexPath, animated: animated)
}
super.viewWillAppear(animated)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func dataService() {
DataService.ds.REF_BARS.observeSingleEvent(of: .value, with: { (snapshot) in
print(snapshot.value as Any)
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
print(snap)
if let barData = snap.value as? Dictionary<String, AnyObject> {
let bar = NightClubs(barData: barData)
self.nightClubs.append(bar)
print(self.nightClubs)
self.tableView.reloadData()
}
self.tableView.reloadData()
}
self.tableView.reloadData()
self.smallerNightClubs = self.nightClubs//.filter { $0.promoted == "Yes"}
}
self.tableView.reloadData()
})
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if isFiltering() {
searchFooter.setIsFilteringToShow(filteredItemCount: filteredNightClubs.count, of: smallerNightClubs.count) // nightClubs.count
return filteredNightClubs.count
}
searchFooter.setNotFiltering()
return nightClubs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell") as! searchCell
let nightClub: NightClubs
if isFiltering() {
nightClub = filteredNightClubs[indexPath.row]
} else {
nightClub = nightClubs[indexPath.row]
}
cell.locationTextLabel.text = nightClub.location
cell.nameTextLabel.text = nightClub.name
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is DetailViewController
{
if let indexPath = self.tableView.indexPathForSelectedRow {
let vc = segue.destination as? DetailViewController
vc?.barName = nightClubs[indexPath.row].name
vc?.barLocation = nightClubs[indexPath.row].location
vc?.barImage = UIImage(named: nightClubs[indexPath.row].name) ?? tempImage
vc?.barPopulation = nightClubs[indexPath.row].goingCount
vc?.barDescription = nightClubs[indexPath.row].description
vc?.barAddress = nightClubs[indexPath.row].address
}
} else {
print("failed segue")
}
}
func searchBarIsEmpty() -> Bool {
return searchController.searchBar.text?.isEmpty ?? true
}
func filterContentForSearchData(_ searchText: String, scope: String = "All") {
filteredNightClubs = smallerNightClubs.filter({( place : NightClubs) -> Bool in
let doesCategoryMatch = (scope == "All") || (place.location == scope)
if searchBarIsEmpty() {
return doesCategoryMatch
} else {
return doesCategoryMatch && place.name.lowercased().contains(searchText.lowercased())
}
})
tableView.reloadData()
}
func isFiltering() -> Bool {
let searchBarScopeIsFiltering = searchController.searchBar.selectedScopeButtonIndex != 0
return searchController.isActive && (!searchBarIsEmpty() || searchBarScopeIsFiltering)
}
}
extension MasterViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar
let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
filterContentForSearchData(searchController.searchBar.text!, scope: scope) //Text
}
}
extension MasterViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
filterContentForSearchData(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope]) //Text
}
}