2015-12-09 35 views
6

Wdrożyłem koncepcję SearchBar w mojej aplikacji, ale ma ona błąd, gdy wprowadzam pierwszy znak w pasku wyszukiwania, to nie działa, a widok tabeli nie pokazuje powiązanych pól i pokazuje pusty widok tabeli, ale wprowadzam drugi znak, który wyświetla powiązane pola w widoku tabeli, nie wiem, jaki błąd popełniono, proszę o pomoc.UISearchBar nie działa po wprowadzeniu pierwszego znaku?

Tutaj podaję mój kod.

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

Jest więcej informacji potrzebnych do poprawnej odpowiedzi na pytanie, czy możesz edytować, dodając kod 'getSearchJsonResponse'? – juanjo

+0

Uzgodniono z @juanjo. Potrzebujemy więcej informacji, aby zapewnić lepszą odpowiedź. Wygląda na to, że wysyłasz wezwanie do serwisu internetowego synchronicznie, co nie jest najlepszą praktyką. Pomożemy Ci rozwiązać ten i główny problem, jeśli mamy więcej informacji. – Alexander

+0

Z opublikowanego przeze mnie kodu, jestem pewien, że wszystko jest w porządku. Problem musi być w metodzie getJsonResponse lub getSearchJsonResponse' –

Odpowiedz

1

Na podstawie kodu z czatu należy dokładnie sprawdzić kod pod kątem wycieków pamięci i problemów z wydajnością. Jest zaśmiecony w każdym miejscu.

To odłożyć, wprowadzić następujące zmiany dać kod szansę pracy:

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

również owinąć [self.tableView reloadData] w depeszy do głównej kolejki w blokach uzupełniania swoich usług internetowych tak:

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

Co ponadto robi dziennik NSLog(@"SEARCHDICT::%@",searchDict);? Czy to możliwe, że Twój brak obsługi błędów pochłania nieudaną odpowiedź na wezwanie serwisu (np. Pusty pasek wyszukiwania lub "Nie szukam długości 1")?

+0

Nie działa ... @ Jan Greve. –

+0

Nie działa, w każdym razie dzięki .. @ Jan Greve –

+0

Czy możesz podać wynik logu z pomyślnego wyszukiwania za pomocą jednego znaku? Myślę, że winowajcą może być twoja porażka w obsłudze błędów. – SmokeDispenser

0

Weź dwie tablice jeden wynik wyszukiwania & tabledataArr

W viewDidLoad dodać ten

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

Dodaj SearchBar Delegata

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

W CellForRowAtIndex również dodać to w inny części

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

Spróbuję tego, ale nie działa prawidłowo ... @ Uma Madhavi. –

0

Wygląda na to, że tabela jest ponownie ładowana przed zakończeniem wywołania json. Spróbuj z 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 { 
    ... 

a dla json wywołanie jak ten

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

Kiedy edytuje tekst w pasku wyszukiwania tekstowym, to delegat nazywany jest coraz.

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

Ta metoda nie będzie działać dla UISearchBar, to będzie działać dla UITextField. –

0

Należy użyć - (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text sposób, aby uzyskać tekst wpisany w UISearchBar. Metoda wygląda

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

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

}

Tutaj 'txt' to tekst, który pojawia się w UISearchBar. Teraz filtrujesz wyniki za pomocą łańcucha "txt". Zadzwoń pod reload na UISearchBarController tableview, aby zaktualizować wyniki wyszukiwania.

0

Spróbuj użyć wartości "searchText", która zostanie przekazana, zamiast próbować wyciągnąć wartość ze składnika interfejsu użytkownika. "searchText" powinien zawsze mieć poprawną wartość. "searchBar.text" nie został jeszcze zaktualizowany.

0

Można spróbować tego kodu:

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

z ApplySearch:

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

myślę w getSearchJsonResponse: powinno być:

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

Może funkcjonować ustawiony wniosek może być różne.

0

zamiast sprawdzać tekst na pasku wyszukiwania, należy użyć searchText.

Robię to samo i to rozwiązało mój problem. Mam nadzieję, że to ci pomoże.