我有一个UISearchBar和显示数据的tableview。当我搜索时,结果正在获取并且能够传递搜索到的电影名称,但是无法传递特定搜索结果的电影ID,我已经尝试过并且无法找到解决方案。以下是我尝试过的内容,请帮助,TIA。
// output of url
{
DataTable: {
searchByCategory: [
{
movie_id: "56",
movie_name: "Avengers"
},
{
movie_id: "20",
movie_name: "Kong Skull Island"
},
.
.
.
]
}
}
// Swift file
var moviesArray = [[String:AnyObject]]()
var searchArr = [""]
var searching: Bool = false
var filtered:[String] = []
// Response
func getSearchResults(url: String, parameters: [String : String]){
Alamofire.request(url, method: .post, parameters: parameters).responseJSON{
response in
if response.result.isSuccess{
print("Success! Got the response")
let responseData = JSON(response.result.value!)
if let resData = responseData["DataTable"]["searchByCategory"].arrayObject{
self.moviesArray = resData as! [[String:AnyObject]]
}
for i in 0..<self.moviesArray.count {
let dict = self.moviesArray[i]
let movieName = dict["movie_name"] as? String
self.searchArr.append(movieName!)
}
}
}
// numberOfRowsInSection {
if searching{
return filtered.count
}
else{
return moviesArray.count
}
}
// cellForRowAt indexPath: {
if searching {
cell?.textLabel?.text = filtered[indexPath.row]
}else
{
let dict = moviesArray[indexPath.row]
cell?.textLabel?.text = dict["movie_name"] as? String
}
}
}
// didSelectRowAt indexPath:{
if(searching){
let movieDetails = MoviesViewController(nibName: "MoviesViewController", bundle: nil)
movieDetails.resDetails = self.filteredId[indexPath.row]
// Here am not able to pass the movie_id of the search results, i can only pass the movie name
navigationController?.pushViewController(movieDetails, animated: true)
}
else{
}
}
// Search Method
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
{
filtered = searchArr.filter({ (text) -> Bool in
let tmp: NSString = text as NSString
let range = tmp.range(of: searchText, options: .caseInsensitive)
return range.location != NSNotFound
})
if(filtered.count == 0)
{
searching = false;
}
else
{
searching = true;
}
self.searchList.reloadData()
}
var isSearchNull: Bool = true {
didSet {
tableView.reloadData()
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var numberOfRows = 0
if isSearchNull {
numberOfRows = moviesArray.count
} else{
numberOfRows = filtered.count
}
return numberOfRows
}
搜索代表
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filtered.removeAll() // the array of search i guess its filtered
guard let textToSearch = searchBar.text, !textToSearch.isEmpty else {
return
}
isSearchNull = textToSearch != "" ? false : true
if !isSearchNull {
if Date().timeIntervalSince(previousRun) > minInterval {
previousRun = Date()
fetchResults(getSearchResults(url : url ) // your networking process
}
}
}
和
func getSearchResults(url: String, parameters: [String : String]){
//// network
fetchData() [weak self ] {
guard let self = self else { return }
if let error = error {
print(error)
}
guard let result = result, !result.isEmpty else { return }
self.filtered = result
}
}
最后]
private var filtered:[String] = []
{
didSet {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.tableView.reloadData()
}
}
}