2017-04-25 2 views
0

Ich habe eine UITableView und eine UISearchBar. Wenn die App geladen wird, übergebe ich eine bestimmte Liste an die Tabellenquelle. Wenn ich eine Abfrage in UISearchBar eingeben und auf die Schaltfläche Suchen klicke, mache ich einen API-Aufruf, um eine neue Liste zu holen.Ändern UITableView Datenquelle auf UISearchBar Suchschaltfläche klicken

Jetzt möchte ich die Quelle des Tableview durch die neue Liste ersetzen, die ich von der API abhole.

Ich kann die Liste gefiltert zunächst auf UISearchView Text ändern, aber ich möchte eine komplett neue Liste auf die Tabelle auf der Suche klicken Sie auf klicken.

Gibt es eine Möglichkeit, die Tabellenquelle mit der neuen Liste mit der UISearchView ändern? oder muss ich eine benutzerdefinierte Suchleiste erstellen?

Ich habe versucht, einen Null-Wert an die Tabellenquelle übergeben und dann die neue Liste übergeben, aber das tut nichts.

Jede Hilfe ist willkommen

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

können Sie Objective-C-Code zu verstehen? – KKRocks

+0

@KKRocks Ja kann ich :) – user3034944

+0

Nutzen Sie enums und manipulieren Sie die Datenquelle entsprechend. –

Antwort

0

Sie benötigen Flagge SearchBar Delegierter zu verwalten.

SearchBar Delegierter

- (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 
} 

Tableview Delegierter

-(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

Danke für die Antwort. Ich sollte nur die UISearchView und nicht die UISearchView mit Display-Controller verwenden oder? – user3034944

+0

ist es nur Suchansicht. – KKRocks

+0

Ich habe diese Lösung versucht. Aber irgendwie wird mein GetCell()/cellForRowAtIndexPath nicht aufgerufen. numberOfRowsInSection() wird aufgerufen, obwohl – user3034944

Verwandte Themen