我有UITableView
和UISearchBar
。当应用程序加载时,我将某个List传递给表源。当我在UISearchBar
中输入查询并点击搜索按钮时,我会进行API调用以获取新列表。
现在我想用从API中获取的新List替换tableview的源代码。
我可以过滤最初在UISearchView
文字更改时传递的列表,但我想在搜索按钮点击时为表格提供一个全新的列表。
有没有办法可以使用UISearchView
使用新列表更改表格来源?或者我是否需要创建自定义搜索栏?
我尝试将null值传递给表源,然后传递新列表,但这没有做任何事情。
感谢任何帮助
修改
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 :(得分:0)
您需要在searchBar Delegate上管理标记。
SearchBar代理
- (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代表
-(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;
}