首页 > 解决方案 > Swift 中的搜索栏不使用 PHP 文件进行搜索

问题描述

我的代码中没有错误,但肯定缺少一些东西。当我在键盘上按下完成时,也没有任何反应。它可能与搜索栏功能或表格视图功能有关。我还有一个 Search.swift 文件,我会添加它。任何建议都会非常有帮助,我觉得真的很卡。

SearchBarViewController

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

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 retrievedList = String(data: data!, encoding: String.Encoding.utf8)
        print(retrievedList!)
        self.parseSongs(data: retrievedList!)
    }
    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 tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return search.count
}

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

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 == "" {
        
        shouldShowSearchResults = false
        
        view.endEditing(true)
        
        filteredData.removeAll()
    } else {
        shouldShowSearchResults = true
        filteredData = search.filter({ (songName) -> Bool in
            songName.searchSongName().range(of: searchText) != nil
        })
            .map { $0.songname }
    }
    tableView.reloadData()
}

标签: iosswift

解决方案


您正在将数据加载到一个名为search.

过滤数据时,会将过滤后的数据放入一个名为filteredData.

您的 tableview 始终显示 的内容search,因此您永远看不到过滤的结果。

您可以检查是否filteredData为空,然后从该数组或searchin 中返回数据numberOfRowsand cellForRow。就我个人而言,我总是会使用filteredData并确保它包含search过滤器字符串为空时的内容。

var filteredData = [Search]()
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())
            }
            self.filterData = self.search
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }
}

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

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let searchSong = filteredData[indexPath.row].searchSongName()
    let fileURLString = "\(filePath)\(searchSong)"
    print(fileURLString)
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if (searchBar.text ?? "").isEmpty {
        view.endEditing(true)

        filteredData = search
    } else {
        filteredData = search.filter({ (songName) -> Bool in
            songName.searchSongName().range(of: searchText) != nil
        })
    }
    tableView.reloadData()
}

推荐阅读