검색 창을 사용하여 가져온 JSON 데이터를 필터링하려고합니다. 그러나 검색 창에 아무 것도 입력하지 않으면 아무 것도 수행하지 않습니다. 데이터는 여전히 같은 위치에 있으며 필터링되지는 않지만 검색 창에 뭔가를 입력 할 때 동적으로 필터링해야합니다.데이터가 검색 창에 의해 필터링되지 않았습니다.
아래 코드는 내 TableViewController와 JSON 데이터를 내 배열에 반입하는 기능을 보여줍니다. 그런 다음 검색 막대를 사용하여 필터링되고 데이터 이름이 검색 막대의 조건과 일치 할 때마다 'filteredExercise'라는 두 번째 배열에 추가됩니다.
import UIKit
class ExerciseTableViewController: UITableViewController, UISearchBarDelegate {
var fetchedExercise = [Exercise]()
var filteredExercise = [Exercise]()
var inSearchMode = false
@IBOutlet var searchBar: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
searchBar.delegate = self
parseData()
}
func parseData() {
fetchedExercise.removeAll()
let urlPath = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2&limit=200"
let url = URL(string: urlPath)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print("Error while parsing JSON")
}
else {
do {
if let data = data,
let fetchedData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any],
let exercises = fetchedData["results"] as? [[String: Any]] {
for eachExercise in exercises {
if eachExercise["license_author"] as! String == "wger.de" {
let name = eachExercise["name"] as! String
let description = eachExercise["description"] as! String
let id = eachExercise["id"] as! Int
self.fetchedExercise.append(Exercise(name: name, description: description, id: id))
}
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
catch {
print("Error while parsing data.")
}
}
}
task.resume()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if inSearchMode {
return filteredExercise.count
}
return fetchedExercise.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "ExerciseCell", for: indexPath) as? ExerciseCell {
let exercise: Exercise!
if inSearchMode {
exercise = filteredExercise[indexPath.row]
cell.configureCell(exercise: exercise)
} else {
exercise = fetchedExercise[indexPath.row]
cell.configureCell(exercise: exercise)
}
return cell
} else {
return UITableViewCell()
}
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var exercise: Exercise!
exercise = fetchedExercise[indexPath.row]
performSegue(withIdentifier: "exerciseDetailVC", sender: exercise)
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == nil || searchBar.text == "" {
inSearchMode = false
self.tableView.reloadData()
} else {
inSearchMode = true
let lower = searchBar.text!.lowercased()
filteredExercise = fetchedExercise.filter({$0.name.range(of: lower) != nil})
self.tableView.reloadData()
}
}
}
아 사실입니다. '@IBOutlet var searchBar : UISearchBar!'로 변경했습니다. 그러나 여전히 문제를 해결하지는 못합니다. – Rvfvl
아직 읽지 않았다면 텍스트를 변경하는 대신 콘센트를 다시 연결해야 할 수도 있습니다. IBOutlet 연결 텍스트를 변경하면 연결이 끊어집니다. 대리인이 설정되어있는 것처럼 보이지만 그렇지 않은 경우 문제가 될 수 있습니다. 스토리 보드를 통해서도 (위임자)이를 연결할 수 있습니다. – Echizzle
도움이된다면 응답을 accepter로 확인하십시오. – SergStav