Ios 输入第一个字符时UISearchBar不工作?

Ios 输入第一个字符时UISearchBar不工作?,ios,objective-c,uitableview,uisearchbar,Ios,Objective C,Uitableview,Uisearchbar,我会在我的应用程序中实现搜索栏的概念,但它有一个错误,当我在搜索栏中输入第一个字符时,它不工作,tableview不显示相关字段,它显示空tableview,但我输入第二个字符,它显示tableview中的相关字段,我不知道犯了什么错误,请帮助我 这里我给出我的代码 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ NSLog(@"searching::");

我会在我的应用程序中实现搜索栏的概念,但它有一个错误,当我在搜索栏中输入第一个字符时,它不工作,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];
   });    
}

根据聊天中的代码,您需要彻底检查代码是否存在内存泄漏和性能问题。到处都是垃圾

抛开这一点,进行以下更改以使代码有机会工作:

-(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”)?

使用两个数组一个搜索结果和tabledataArr

在ViewDidLoad中添加以下内容

self.searchResult = [NSMutableArray arrayWithCapacity:[dataArr count]];
添加搜索栏委托

-(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];
 }
}
在CellForRowatinex中,也将此添加到else部分

if (tableView == self.searchDisplayController.searchResultsTableView)
{
    cell.textLabel.text = [self.searchResult objectAtIndex:indexPath.row];
}

似乎在json调用完成之前重新加载了tableView。 尝试使用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);}

在搜索栏文本字段中编辑文本时,将调用此代理

- (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;
}
应使用
-(BOOL)搜索栏:(UISearchBar*)搜索栏应更改文本范围:(NSRange)范围替换文本:(NSString*)文本
方法获取在
UISearchBar
中输入的文本。方法看起来像

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

NSString * txt = [searchBar.text stringByReplacingCharactersInRange:range withString:text];    
return YES;
}


这里的“txt”是出现在
UISearchBar
中的文本。现在,您可以使用“txt”字符串过滤结果。在
UISearchBarController
tableview上调用
reload
,以更新搜索结果。

尝试使用传入的“searchText”值,而不是尝试从UI组件中提取该值searchText“应始终具有正确的值。”searchBar.text“可能尚未更新

您可以尝试以下代码:

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];
        });
    }];
}

您的功能集请求可能不同。

您必须使用searchText,而不是检查搜索栏上的文本


我正在做同样的事情,这解决了我的问题。希望它也能帮助您。

不起作用…@Jan Greve。您能用一个字符提供成功搜索的日志结果吗?我认为罪魁祸首可能是你在错误处理上的失败。需要更多信息来正确回答这个问题,你可以添加
getSearchJsonResponse
?的代码进行编辑吗?同意@juanjo。我们需要更多的信息为您提供更好的答案。看起来您正在同步发送web服务调用,这不是最佳做法。如果我们有更多的信息,我们可以帮助您解决这个问题和您的主要问题。从您发布的代码来看,我相信这是完全正确的。。问题必须出现在
getJsonResponse
getSearchJsonResponse
method@saravana-你的问题是否已解决兄弟…我将尝试此方法,但无法正常工作…@Uma Madhavi。此方法不适用于UISearchBar,此方法适用于UITextField。