2016-12-23 6 views
1

원격 서버의 json 데이터를 사용하여 테이블을 채 웠습니다.Swift 3 테이블 검색

이제 검색 결과를 필터링 할 검색 창을 추가하려고합니다.

제가 직면 한 문제는 json 데이터를 여러 배열에 저장하고 있다는 것입니다.

이름, 회사, 직책 등

이 사용자가 검색 할 때 이름 만 배열이 여과하고 올바르게 테이블에 표시되는 것을 의미가 필터링되지 않은 남아있는 한, 다른 정보가 동기화됩니다.

올바른 방법으로 접근합니까?

class attendees: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { 

    var tableData = "" 

    var value:String! 

    var searchString = "" 

    var firstname: [String] = [] 
    var lastname: [String] = [] 
    var fullname: [String] = [] 
    var company: [String] = [] 
    var jobtitle: [String] = [] 
    var image: [String] = [] 


    var filteredAppleProducts = [String]() 
    var resultSearchController = UISearchController() 

    @IBOutlet weak var tableView: UITableView! 

    @IBOutlet weak var searchBar: UISearchBar! 

    override func viewDidLoad() { 

     print(value) 



     searchBar.delegate = self 



     self.tableView.reloadData() 

     let nib = UINib(nibName: "vwTblCell2", bundle: nil) 
     tableView.register(nib, forCellReuseIdentifier: "cell2") 


    } 

    override func viewDidAppear(_ animated: Bool) { 
     getTableData() 

    } 


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 


     if filteredAppleProducts != []{ 

      return self.filteredAppleProducts.count 
     } 
     else 
     { 

      if searchString != "[]" { 
      return self.firstname.count 
      }else { 
       return 0 
      } 
     } 

    } 


    // 3 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell2: TblCell2 = self.tableView.dequeueReusableCell(withIdentifier: "cell2") as! TblCell2 

     print(filteredAppleProducts) 


     if filteredAppleProducts != []{ 

      cell2.nameLabel.text = self.filteredAppleProducts[indexPath.row] 

      return cell2 
     } 
     else 
     { 
      if searchString != "[]"{ 
      cell2.nameLabel.text = "\(self.firstname[indexPath.row]) \(self.lastname[indexPath.row])" 
       cell2.companyLabel.text = self.company[indexPath.row] 
       cell2.jobTitleLabel.text = self.jobtitle[indexPath.row] 


       let url = URL(string: "https://www.asmserver.co.uk/wellpleased/backend/profileimages/\(self.image[indexPath.row])") 
       let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check/try-catch 
       cell2.userImage.image = UIImage(data: data!) 

      } 
      return cell2 


     } 
    } 

    // 4 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    } 

    // 5 
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     return 90 
    } 


    func updateSearchResults(){ 


     self.filteredAppleProducts.removeAll(keepingCapacity: false) 

     let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchString) 
     let array = (self.fullname as NSArray).filtered(using: searchPredicate) 
     self.filteredAppleProducts = array as! [String] 

     self.tableView.reloadData() 

     print(filteredAppleProducts) 


    } 


    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
     print("searchText \(searchText)") 
     print(filteredAppleProducts) 

     searchString = searchText 
     updateSearchResults() 
      } 

    func getTableData(){ 

     self.firstname.removeAll() 
     self.lastname.removeAll() 
     self.fullname.removeAll() 
     self.company.removeAll() 
     self.jobtitle.removeAll() 
     self.image.removeAll() 


     let defaults = UserDefaults() 
     let userid = defaults.string(forKey: "id") 

     let url = NSURL(string: "https://www.asmserver.co.uk/wellpleased/backend/searchattendees.php?userid=\(userid!)&eventid=\(value!)") 

     print(url) 

     let task = URLSession.shared.dataTask(with: url as! URL) { (data, response, error) -> Void in 

      if let urlContent = data { 

       do { 

        if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] { 


         var i = 0 

         while i < jsonResult.count { 


          self.firstname.append(jsonResult[i]["firstname"]! as! String) 
          self.lastname.append(jsonResult[i]["lastname"]! as! String) 

          let fname = jsonResult[i]["firstname"]! as! String 
          let lname = jsonResult[i]["lastname"]! as! String 
          let fullname1 = "\(fname) \(lname)" 

          self.fullname.append(fullname1) 

          self.company.append(jsonResult[i]["company"]! as! String) 
          self.jobtitle.append(jsonResult[i]["jobtitle"]! as! String) 
          self.image.append(jsonResult[i]["image"]! as! String) 




          i = i + 1 

         } 

        } 

       } catch { 

        print("JSON serialization failed") 

       } 

      } else { 

       print("ERROR FOUND HERE") 
      } 

      DispatchQueue.main.async(execute: {() -> Void in 

       self.tableView.reloadData() 

      }) 

      self.tableView.isUserInteractionEnabled = true 
     } 

     task.resume() 

    } 
} 
+0

저도 같은 문제에 직면하고있다 누군가가 내게 코드를 줄 수있는 ... 그것은 매우 도움이 될 것입니다 –

답변

2

데이터에 구조체 또는 클래스를 사용하십시오. 이렇게하면 데이터를 추적하는 것이 더 쉬울 것이고, 어떤 경우 든 7 개의 다른 배열을 추적 할 좋은 이유가없는 것처럼 보입니다.

struct Data { 
    var firstName: String 
    var lastName: String 
    var fullName: String 
    var company: String 
    var jobTitle: String 
    var image: String 
} 

그리고 단지 하나 개의 배열 채울 : 예를 들어

속성 이름

var dataSource: [Data] = [] 

액세스를 대신 arrayName[index] :

let name = dataSource[index].firstName 
+0

그 똑똑, 고마워요! – MattBlack