2017-11-26 9 views
2

검색 창을 사용하여 가져온 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() 
    } 
} 



} 

답변

1

오류가있는 것 같습니다.

@IBOutlet var searchBar: UITableView! 

나는 UISearchBarController 유형이어야한다고 생각합니다.

+0

아 사실입니다. '@IBOutlet var searchBar : UISearchBar!'로 변경했습니다. 그러나 여전히 문제를 해결하지는 못합니다. – Rvfvl

+0

아직 읽지 않았다면 텍스트를 변경하는 대신 콘센트를 다시 연결해야 할 수도 있습니다. IBOutlet 연결 텍스트를 변경하면 연결이 끊어집니다. 대리인이 설정되어있는 것처럼 보이지만 그렇지 않은 경우 문제가 될 수 있습니다. 스토리 보드를 통해서도 (위임자)이를 연결할 수 있습니다. – Echizzle

+0

도움이된다면 응답을 accepter로 확인하십시오. – SergStav

0

오케이, 나는 마침내 무엇이 잘못되었는지 알아 냈습니다.

우선 기본적으로 Xcode 버그로 인해 내 searchBar에 대한 잘못된 유형이 있고 그 사실을 알지 못했습니다. 그런 다음 IBOutlet을 스토리 보드에 연결해야했기 때문에 스토리 보드를 완성하지 못했습니다. 마지막으로 데이터를 필터링하는 동안 잘못된 결과가 나오기 시작했습니다. 왜냐하면 모든 데이터가 대문자 인 반면 lowercased() 함수를 사용하여 결과를 필터링했기 때문입니다.

관련 문제