我会在我的应用程序中实现SearchBar概念,但它有一个错误,当我输入搜索栏中的第一个字符时它不起作用而tableview没有显示相关字段,它显示空的tableview但我输入它显示的第二个字符tableview中的相关字段,我不知道是什么错误让我帮助我。
我在这里给出了我的代码。
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
NSLog(@"searching::");
if(searchBar.text.length == 0)
{
[searchDict removeAllObjects];
[arrayDict removeAllObjects];
searchDict=[[NSMutableArray alloc]init];
arrayDict=[[NSMutableArray alloc]init];
[self getJsonResponse];
[self.tableView reloadData];
} else {
[arrayDict removeAllObjects];
arrayDict=[[NSMutableArray alloc]init];
}
dispatch_async(dispatch_get_main_queue(), ^{
[self getSearchJsonResponse:searchBar.text];
NSLog(@"searchDict::%@",searchDict);
[self.tableView reloadData];
});
}
答案 0 :(得分:1)
根据聊天中的代码,您需要彻底检查代码是否存在内存泄漏和性能问题。它遍布整个地方。
放下一边,进行以下更改以使代码有机会工作:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
if(searchBar.text.length == 0) {
[searchDict removeAllObjects];
[arrayDict removeAllObjects];
[self getJsonResponse];
}
else {
[arrayDict removeAllObjects];
[self getSearchJsonResponse:searchBar.text];
}
}
另外,将[self.tableView reloadData]
包装到您的Web服务中的主队列中。像这样的完成块:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
此外,NSLog(@"SEARCHDICT::%@",searchDict);
会记录什么?您是否有可能因为没有错误处理而吞没了失败的Web服务呼叫响应(例如,空搜索栏或“我没有搜索长度1'”)
答案 1 :(得分:0)
拿两个阵列一个searchResult& tabledataArr
在ViewDidLoad中添加此
self.searchResult = [NSMutableArray arrayWithCapacity:[dataArr count]];
添加SearchBar代理
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
[self.searchResult removeAllObjects];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchText];
self.searchResult = [NSMutableArray arrayWithArray: [dataArr filteredArrayUsingPredicate:resultPredicate]];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView)
{
return [self.searchResult count];
}
else
{
return [dataArr count];
}
}
在CellForRowAtIndex中也将此添加到else部分
if (tableView == self.searchDisplayController.searchResultsTableView)
{
cell.textLabel.text = [self.searchResult objectAtIndex:indexPath.row];
}
答案 2 :(得分:0)
看起来你的tableView在json调用完成之前重新加载。 尝试使用completionBlock:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
NSLog(@"searching::");
if(searchBar.text.length == 0)
{
[searchDict removeAllObjects];
[arrayDict removeAllObjects];
//Reload when networkcall is complete
[self getJsonResponseWithCompletionBlock:^(NSMutableArray *allResults, NSError *error) {
//if no error fill Dictionary and reload ...
[self.tableView reloadData];
}];
} else {
...
对于像这样的json调用
-(void)getJsonResponseWithCompletionBlock:(void(^)(NSMutableArray *allResults, NSError *error))completionBlock {
//Do what ever is needed to get data
//...
//when data is ready call block
completionBlock(allResults,nil);}
答案 3 :(得分:0)
您应该使用- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
方法获取UISearchBar
中输入的文字。方法看起来像
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSString * txt = [searchBar.text stringByReplacingCharactersInRange:range withString:text];
return YES;
}
这里' txt'是UISearchBar
中显示的文字。现在,您可以使用&#t; txt'来过滤结果。串。在reload
tableview上调用UISearchBarController
以更新搜索结果。
答案 4 :(得分:0)
尝试使用' searchText'传入的值,而不是试图从UI组件中提取值。 ' SEARCHTEXT'应始终具有正确的值。 ' searchBar.text'可能尚未更新。
答案 5 :(得分:0)
您可以尝试以下代码:
if ([searchText isEqualToString:@""])
{
[searchDict removeAllObjects];
[arrayDict removeAllObjects];
dispatch_async(dispatch_get_main_queue(), ^{
[self.searchResultController.tableView reloadData];
});
}
[YourController cancelPreviousPerformRequestsWithTarget:self selector:@selector(applySearch) object:nil];
if (![searchBar.text isEqualToString:@""]) {
[self performSelector:@selector(applySearch) withObject:nil afterDelay:1];
}
使用ApplySearch:
- (void)applySearch{
[self getSearchJsonResponse:searchBar.text];
}
我认为getSearchJsonResponse:
应该是:
- (void)getSearchJsonResponse:(NSString *)text {
//Maybe like this:
[self getJsonResponseWithCompletionBlock:^(NSMutableArray *allResults, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}];
}
也许你的功能设置请求可能不同。
答案 6 :(得分:0)
而不是检查搜索栏上的文字,您必须使用searchText。
我正在做同样的事情,这解决了我的问题。希望它也能帮到你。
答案 7 :(得分:-1)
在搜索栏文本字段中编辑文本时,将调用此委托。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *text = [[textField text] stringByReplacingCharactersInRange:range withString:string];
// make search call with updated text.
[self startSeachWithText:text];
return YES;
}