Как сделать так, чтобы результаты поиска не отображались в моем табличном представлении из панели поиска? - PullRequest
1 голос
/ 04 мая 2020

Моя цель - чтобы результаты поиска из моего рабочего php поискового файла отображались в моем табличном представлении. В контроллере представления поиска нет ошибок, но определенно чего-то не хватает, и я не могу этого понять. У меня есть еще один файл .swift. Я не уверен, где проблема. Есть предложения?

 let url = URL(string: "http://127.0.0.1/musicfiles/search.php")
var filteredData = [String]()
var isSearching = false
var search: [Search] = []
var filePath = "http://127.0.0.1/musicfiles/"

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    searchBar.delegate = self
    searchBar.returnKeyType = UIReturnKeyType.done

   let task = URLSession.shared.dataTask(with: url!) { (data, snapshot, error) in


           let retrevedList = String(data: data!, encoding: String.Encoding.utf8)
                 print(retrevedList!)
                 self.parseSongs(data: retrevedList!)
                }
    task.resume()
            }

func parseSongs (data: String) {

    if (data.contains("*")) {
        let dataArray = (data as String).split(separator: "*").map(String.init)
        for item in dataArray {
            let itemData = item.split(separator: ",").map(String.init)
            let searchSong = Search(songname: itemData[0])
    search.append(searchSong!)

            for s in search {
            print(s.searchSongName())
        }
        DispatchQueue.main.async {
          self.tableView.reloadData()
        }
    }
   }


 }
      func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isSearching {
        return filteredData.count
    }
    return filteredData.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? DataCell {

        let text: String!

        if isSearching {
            text = filteredData[indexPath.row]
        } else {

            text = filteredData[indexPath.row]
        }
        cell.congigureCell(text: text)

        return cell


    } else {

        return UITableViewCell()

    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let searchSong = search[indexPath.row].searchSongName()
    let fileURLString = "\(filePath)\(searchSong)"
    print(fileURLString)

}
   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       if searchBar.text == nil || searchBar.text == "" {

           isSearching = false

           view.endEditing(true)

           tableView.reloadData()
       } else {
           isSearching = true

           tableView.reloadData()
       }

}}

1 Ответ

2 голосов
/ 04 мая 2020

Прежде всего необходимо отфильтровать данные в textDidChange

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
   if searchText.isEmpty {
       isSearching = false
       view.endEditing(true)
       filteredData.removeAll()      
   } else {
       isSearching = true
       filteredData = search.filter{ $0.songname.range(of: searchText, options: .caseInsensitive) != nil }
   }
   tableView.reloadData()
}

Затем необходимо изменить все методы источника данных, чтобы они отображали массив search или filteredData.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return isSearching : search.count ? filteredData.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DataCell           
    let song = isSearching ? search[indexPath.row] : filteredData[indexPath.row]
    cell.congigureCell(text: song.songname)
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let searchSong =  isSearching ? search[indexPath.row] : filteredData[indexPath.row]
    let fileURLString = "\(filePath)\(searchSong.songname)"
    print(fileURLString)

}

Примечание:

Необязательное связывание (if let cell) в cellForRow бессмысленно. В случае ошибки проектирования код взломает sh, и проблема может быть исправлена ​​немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...