Как сделать мою строку поиска в строке поиска после асинхронного - PullRequest
0 голосов
/ 10 июля 2019

Итак, я сделал приложение для 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...