Передача дополнительных данных из UISearchController Swift - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть UISearchBar и таблица, отображающая данные. Когда я выполняю поиск, результаты получаются, и я могу передать найденное имя mov ie, но не могу передать идентификатор mov ie для определенных результатов поиска, я попытался и не могу найти решение , Вот то, что я пытался помочь, пожалуйста, 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()
    }

1 Ответ

1 голос
/ 20 апреля 2020
 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()
            }
        }
    }
...