2015-12-09 5 views
6

Ich würde SearchBar Concept in meiner App implementieren, aber es hat einen Fehler, wenn ich das erste Zeichen in der Suchleiste eingeben, funktioniert es nicht und Tabellenansicht zeigt nicht die verwandten Felder und es zeigt leere Tabellenansicht, aber ich gebe das zweite Zeichen, das es anzeigt verwandte Felder in der Tabellenansicht, ich weiß nicht, welcher Fehler mich gemacht wurde, bitte hilf mir.UISearchBar funktioniert nicht, wenn das erste Zeichen eingeben?

Hier gebe ich meinen Code.

+0

Es gibt weitere Informationen benötigt, um richtig auf die Frage zu beantworten, können Sie es bearbeiten und den Code "getSearchJsonResponse" hinzufügen? – juanjo

+0

Vereinbart mit @juanjo. Wir brauchen mehr Informationen, um Ihnen eine bessere Antwort zu geben. Es sieht so aus, als würden Sie einen Web-Service-Anruf synchron senden, was keine optimale Vorgehensweise darstellt. Wir können Ihnen helfen, dieses und Ihr Hauptproblem zu beheben, wenn wir mehr Informationen haben. – Alexander

+0

Von dem Code, den Sie geschrieben haben, bin ich mir sicher, dass es vollkommen in Ordnung ist. Problem muss in 'getJsonResponse' oder' getSearchJsonResponse' Methode sein –

Antwort

1

Basierend auf Ihrem Code aus dem Chat müssen Sie Ihren Code gründlich auf Speicherlecks und Leistungsprobleme überprüfen. Es ist überall verstreut.

das beiseite legen, die folgenden Änderungen des Code eine Chance zu geben zu arbeiten:

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

auch wickeln [self.tableView reloadData] wie so Abschluss blockiert in Ihren Web-Diensten für die Hauptwarteschlange in einer Depesche,:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 

Zusätzlich, was protokolliert NSLog(@"SEARCHDICT::%@",searchDict);? Könnte es sein, dass Ihr fehlendes Fehlerhandling eine fehlgeschlagene Webservice-Anrufantwort verschluckt (wie leere Suchleiste oder "Ich suche nicht nach Länge 1")?

+0

Not Working ... @ Jan Greve. –

+0

Funktioniert nicht, trotzdem danke .. @ Jan Greve –

+0

Könnten Sie das Log-Ergebnis von der erfolgreichen Suche mit einem char? Ich denke, der Täter könnte Ihr Fehler bei der Fehlerbehandlung sein. – SmokeDispenser

0

Take Two Arrays ein search & tabledataArr

In ViewDidLoad fügen Sie diese

self.searchResult = [NSMutableArray arrayWithCapacity:[dataArr count]]; 

SearchBar Delegierter

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

In CellForRowAtIndex hinzufügen auch dies in anderen Teil hinzufügen

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

Ich werde versuchen, aber nicht richtig funktioniert ... @ Uma Madhavi. –

0

Scheint, dass Ihr TableView neu geladen wird, bevor der JSON-Aufruf ausgeführt wird. mit completionBlock Versuchen:

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

und fordern json wie diese

-(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);} 
-1

Wenn Text in Suchleiste Textfeld bearbeitet, dann ist dieser Delegat wird immer genannt.

- (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; 
} 
+0

Diese Methode funktioniert nicht für UISearchBar, dies wird für UITextField funktionieren. –

0

sollten Sie - (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text Methode verwenden, um den Text in UISearchBar eingegeben zu bekommen. Verfahren sieht aus wie

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

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

}

Hier txt "ist der Text, der in der UISearchBar erscheint. Jetzt filtern Sie die Ergebnisse mit der Zeichenfolge 'txt'. Rufen Sie reload auf UISearchBarController tableview auf, um Suchergebnisse zu aktualisieren.

0

Versuchen Sie, den Wert 'searchText' zu verwenden, der übergeben wird, anstatt zu versuchen, den Wert aus der UI-Komponente abzurufen. 'searchText' sollte immer den richtigen Wert haben. 'searchBar.text' wurde möglicherweise noch nicht aktualisiert.

0

Sie diesen Code versuchen:

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

mit ApplySearch:

- (void)applySearch{ 
    [self getSearchJsonResponse:searchBar.text]; 
} 

ich in getSearchJsonResponse: denke, es sollte sein:

- (void)getSearchJsonResponse:(NSString *)text { 
    //Maybe like this: 
    [self getJsonResponseWithCompletionBlock:^(NSMutableArray *allResults, NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
     }); 
    }]; 
} 

Vielleicht setzen Anfrage Funktion von Ihnen sein kann anders.

0

Anstatt Text in der Suchleiste zu prüfen, müssen Sie searchText verwenden.

Ich mache das gleiche und das hat mein Problem gelöst. Hoffe es hilft dir auch.