2017-04-25 6 views
0

私はUITableViewUISearchBarです。アプリケーションがロードされると、特定のListをテーブルソースに渡します。 UISearchBarにクエリを入力して[検索]ボタンを押すと、API呼び出しを行って新しいリストを取得します。UITearchViewの検索ボタンでUITableViewデータソースを変更します。

今、私は、テーブルビューのソースをAPIから取得した新しいリストで置き換えたいと考えています。

最初に渡されたリストをフィルターに掛けることができますUISearchViewテキストは変更されましたが、検索ボタンのクリックでテーブルに完全に新しいリストを提供したいと思います。

UISearchViewを使用して新しいリストでテーブルソースを変更する方法はありますか?カスタム検索バーを作成する必要はありますか?

テーブルソースにnull値を渡してから新しいリストを渡そうとしましたが、何もしません。

すべてのヘルプは

EDIT

あなたが検索バーの委任にフラグを管理する必要がMytableViewController

Initialize() 
     { 
      if (!string.IsNullOrEmpty(savedRelatedList)) 
       { 
        if (CrossConnectivity.Current.IsConnected) 
        { 

         loadingOverlay = new LoadingOverlay(UIScreen.MainScreen.Bounds, message); 
         this.View.Add(loadingOverlay); 

         //Fetch Related People 
         var relatedData = await O365Service.GetRelatedPeople(GRAPH_ACCESS_TOKEN); 
         if (relatedData != null) 
         { 
          relatedPeopleList = relatedData.Value.Where(d => !string.IsNullOrEmpty(d.userPrincipalName) && (!d.userPrincipalName.Equals(my_email))).ToList(); ; 
          if (relatedPeopleList != null && relatedPeopleList.Count > 0) 
          { 
           NSUserDefaults.StandardUserDefaults.SetString(JsonConvert.SerializeObject(relatedPeopleList.ToList()), "RelatedList"); 

          } 
          else 
          { 
           relatedPeopleList = null; 
          } 
         } 
         else 
         { 

         } 
         loadingOverlay.RemoveFromSuperview(); 
        } 
        else 
        { 
         DialogHelper.CreateAndShowDialog("Network Error", "Check your internet connectivity"); 

        } 
       } 

       relatedPeopleList = new List<PeopleRelated>(); 
       relatedPeopleList.Add(new PeopleRelated { displayName = "Test", }); 

       searchNewPeopleBar.CancelButtonClicked += delegate 
       { 
        searchNewPeopleBar.Text = ""; 
        isSearch = false; 
        peopleList = null; 
        tablePeopleSearch.ReloadData(); 
        searchNewPeopleBar.ResignFirstResponder(); 
       }; 

       var dataSource = new PeopleSearchSource(this); 
       tablePeopleSearch.Source = dataSource; 
       searchNewPeopleBar.SearchButtonClicked += SearchBar_SearchButtonClicked; 
     } 


     searchNewPeopleBar.CancelButtonClicked += delegate 
       { 
        searchNewPeopleBar.Text = ""; 
        isSearch = false; 
        peopleList = null; 
        tablePeopleSearch.ReloadData(); 
        searchNewPeopleBar.ResignFirstResponder(); 
       }; 

     private async void SearchBar_SearchButtonClicked(object sender, EventArgs e) 
     { 
      var searchText = searchNewPeopleBar.Text; 
      if(string.IsNullOrEmpty(searchText)) 
      { 
       isSearch = false; 
      } 
      isSearch = true; 

      //Make api call and get new list 
      tablePeopleSearch.ReloadData(); 
     } 

PeopleSearchSource

public override nfloat GetHeightForRow(UITableView tableView, Foundation.NSIndexPath indexPath) 
      { 
       return 150; 
      } 
      public override nint RowsInSection(UITableView tableview, nint section) 
      { 
       if(peopleHomeController.isSearch) 
       { 
        return peopleHomeController.peopleList.Count; 
       } 
       else 
       { 
        return peopleHomeController.relatedPeopleList.Count; 

       } 

      } 

      public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
      { 
       cell = peopleHomeController.tablePeopleSearch.DequeueReusableCell("people_search_cell") as PeopleSearchCell; 


       if(peopleHomeController.isSearch) 
       { 
        var data = peopleHomeController.peopleList.ElementAt(indexPath.Row); 
        cell.UpdateCell(data); 
       } 
       else 
       { 
        var data = peopleHomeController.relatedPeopleList.ElementAt(indexPath.Row); 
        cell.UpdateCell(data); 
       } 


       return cell; 
      } 
+0

あなたはObjective Cのコードを理解することができますか? – KKRocks

+0

@KKRocksはいできます:) – user3034944

+0

enumを利用し、それに応じてデータソースを操作します。 –

答えて

0

を高く評価しています。

検索バーの委任

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    searchBar.text = @""; 
    isSearch = NO ; 
    [arrFilter removeAllObjects]; 
    [searchTblView reloadData]; 
    [searchBar resignFirstResponder]; 
} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{ 
    NSLog(@"search text :%@",searchBar.text); 
    NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
    NSString *strSearch = [searchBar.text stringByTrimmingCharactersInSet:whitespace]; 
    isSearch = YES; 
    if ([strSearch isEqualToString:@""]) { 
     isSearch = NO; 
    } 
    // call api here and reload tableview 
} 

テーブルビューのデリゲート

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    if (isSearch) { 
     return arrFilter.count;; 
    } 
    return arrMain.count; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    NSString *identifier = @"searchCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    NSString *strname = [isSearch ? arrFilter :arrMain objectAtIndex:indexPath.row ]; // change your array here 
    UILabel *lblRecipeName = (UILabel *)[cell viewWithTag:101]; 
    lblRecipeName.text = strname; 

    return cell; 
} 
+0

答えをありがとう。私はUISearchViewだけを使用し、UISearchViewは表示コントローラーの右側で使用しないでください。 – user3034944

+0

検索ビューのみです。 – KKRocks

+0

私はこの解決策を試しました。しかし、どういうわけか私のGetCell()/ cellForRowAtIndexPathは呼び出されていません。 numberOfRowsInSection()は呼び出されますが – user3034944

関連する問題