2017-05-08 16 views
0

私はこの小さな問題に取り残されています。私はtableviewcontrollerも持っており、これもまたsearchresultcontrollerです。私は各apiの呼び出しに対して正しいデータを取得していますが、tableviewはリロードしていません。なぜ私はそれが働いていないのか分からない。どんな援助や鉛も非常に高く評価されます。テーブルビューがデータをリロードしていない

class MasterViewController: UITableViewController,UISearchResultsUpdating { 
    var request:DataRequest? 
    var peopleArr:[Peoples] = [] 

    // MARK: - View Setup 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.title = "Search" 

     definesPresentationContext = true 
    } 

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
     return 50.0 
    } 
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     if indexPath.section == 1 { 
      //   if searchController.searchBar.selectedScopeButtonIndex == 0 { 
      let profileVc = self.storyboard?.instantiateViewController(withIdentifier: "profileVc") as! ProfileController 
      profileVc.profileData = (peopleArr[indexPath.row].user_id, peopleArr[indexPath.row].user_id) 
      self.navigationController?.pushViewController(profileVc, animated: true) 
     } 
    } 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return peopleArr.count 
    } 
    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     return tableView.dequeueReusableCell(withIdentifier: "headerPeopleSec") 
    } 

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return "People" 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "FollowingsCell", for: indexPath) as! FollowingsCell 
     cell.textLabel?.text = "\(indexPath.row)" 
     let people: Peoples 
     people = peopleArr[indexPath.row] 

     if people.following == "1" { 
      cell.followBtn.isHidden = true 
     } 
     else{ 
      cell.followBtn.isHidden = false 
     } 
     cell.profile_thumb!.showImageWithURL(urlString: people.photo_url) 
     cell.addAction = { cell in 
      self.addFriendAction(indexPath: indexPath , user:people) 
     } 
     cell.profile_thumb.motionIdentifier = people.user_id 
     cell.username.text = people.user_name 
     return cell 
    } 
    func getPeopleList(searchString:String?) { 
     if let req = self.request { 
      req.cancel() 
     } 
     let peopleBag = [ 
      "auth_token": (MemberProfile.loggedUser?._auth_token())!, 
      "per_page": 30, 
      "page": 1, 
      "search_key": searchString ?? "" 
      ] as [String : Any] 
     NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData) 
     self.request = HelperClass().doGetRequestCustom(url: BASE_URL + SEARCH_PEOPLE, param:peopleBag, header: [:], completion: {(response,responseObject, error) in 

      if let resMsg = (responseObject?.message.resp_status) { 
       NVActivityIndicatorPresenter.sharedInstance.stopAnimating() 

       //    if let hasNext = responseObject?.message.paging_data.next_page_exist as? Bool { 
       //     self.hasNextPage = hasNext 
       //    } 
       let dictionary:[String: AnyObject]? = responseObject?.message.data as? [String:AnyObject] //["member_followings"] 

       if let dict:Array = dictionary?["member_profiles"] as? Array<[String:AnyObject]>{ 

        for dic in dict { 
         let friend = Peoples() 
         friend.photo_url = (dic["photo"] as? String) ?? "" 
         friend.user_name = ((dic["user"]?["username"])! as String) 
         friend.user_id = (dic["id"])! as! String 
         friend.following = (dic["is_following"])! as! String 
         self.peopleArr.append(friend) 
        } 
        self.tableView.reloadData() 
       } 
       else{ 
       } 
      } 
      else{ 
       NVActivityIndicatorPresenter.sharedInstance.stopAnimating() 
      } 

      NVActivityIndicatorPresenter.sharedInstance.stopAnimating() 
     }) 
    } 

    func addFriendAction(indexPath:IndexPath , user:Peoples) { 
     let followBag = [ 
      "auth_token": (MemberProfile.loggedUser?.auth_token)!, 
      "following_profile_id": user.user_id 
      ] as [String : Any] 
     NVActivityIndicatorPresenter.sharedInstance.startAnimating(activityData) 
     HelperClass().doPostRequest(url: BASE_URL+FOLLOW_MEMBER , param: followBag, completion: { (dataResponse,response,error) in 

      if (response != nil) && (response?.message.resp_status)! 
      { 
       NVActivityIndicatorPresenter.sharedInstance.stopAnimating() 
       let cell = self.tableView.cellForRow(at: indexPath) as! FollowingsCell 
       cell.followBtn.isHidden = true 
       user.following = "1" 
      } 
      else 
      { 
       if (response != nil){ 
        NVActivityIndicatorPresenter.sharedInstance.stopAnimating() 
        HelperClass.showAlertViewWithTitle(title: "Error", Text: (response?.message.message)!, controllerToShowOn: self) 
       } 
       else{ 
        NVActivityIndicatorPresenter.sharedInstance.stopAnimating() 
        HelperClass.showAlertViewWithTitle(title: "Error", Text: "Something went wrong. Please check your internet connection & try again later.", controllerToShowOn: self) 
       } 
       return 
      } 
     }) 
    } 
    func updateSearchResults(for searchController: UISearchController) { 
     if !(searchController.searchBar.text! == "") { 
      self.peopleArr.removeAll() 
      self.tableView.reloadData() 
      let searchBar = searchController.searchBar 
      self.getPeopleList(searchString: searchBar.text!) 
     } 
    } 
    } 
+0

メインスレッドでテーブルビューを再読み込みしていますか?私はあなたが非同期でそれをリロードしようとしているのを見ています。 – ridvankucuk

+0

私もそれを試みました。 did not work – DaIOSGuy

+0

私はreloadData()の呼び出しの後にデータを取得するかもしれないと思います。どのように補完ハンドラを記述し、すべてのデータを持っている場合にのみreloadData()を呼び出しますか? numberOfRowsInSectionより前の – mat

答えて

0

あなたは、メインスレッド上であなたのリロード呼び出しを行う必要があります。

... 
for dic in dict { 
    let friend = Peoples() 
    friend.photo_url = (dic["photo"] as? String) ?? "" 
    friend.user_name = ((dic["user"]?["username"])! as String) 
    friend.user_id = (dic["id"])! as! String 
    friend.following = (dic["is_following"])! as! String 
    self.peopleArr.append(friend) 
} 
dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    self.tableView.reloadData() 
}) 
... 

すべてのUIの変更は、常にメインスレッド上で行われなければなりません。補完ハンドラに入っているほとんどの場合、UIを変更するためにメインにディスパッチする必要があります。

+0

も動作しませんでした – DaIOSGuy

+0

@DaIOSGuy OK、他のものを見てみましょう。ブレークポイントを設定し、データが正しく読み込まれてデータソースに追加されていることを確認しましたか? –

+0

@DaIOSGuyなぜself.getPeopleList(searchString:searchBar.text!)コールの前と途中でtableViewをリロードしていますか?これは高価な操作であり、できるだけ実行する必要があります。 –

0

func updateSearchResults(for searchController: UISearchController)と思われます。 self.tableView.reloadData()をこの機能の最後に移動できますか? reloadDataが呼び出され、配列がクリアされ、まだ新しい値が設定されていないようです。

+0

ちょうどそれをしました。 – DaIOSGuy

関連する問題