2015-11-14 22 views
8

Używam UITableViewController z UISearchBar. Wszystko wydaje się działać dobrze, z wyjątkiem tego, że otrzymuję dziwne ostrzeżenie w metodzie textDidChange, której nigdy wcześniej nie widziałem.UISearchBar textDidChange błąd tworzenia: Widoczne są widoki po ponownym użyciu wszystkich: {(null) = (null); }

To jest mój kod:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 

    [self.searchResults removeAllObjects]; 
    if([searchText isEqualToString:@""]||searchText==nil){ 
     [self.tableView reloadData]; 
     return; 
    } 

    for(NSArray *monsterArray in self.monsterArray) { 
     NSString *name = monsterArray[0]; 
     NSRange r = [[name lowercaseString] rangeOfString:[searchText lowercaseString]]; 
     if(r.location != NSNotFound) { 
      if(r.location==0) { 
       [self.searchResults addObject:monsterArray]; 
      } 
     } 
    } 

    [self.tableView reloadData]; 
} 

poprzez intensyfikację w ramach programu, znalazłem, że ostrzeżenie pojawia się tuż przed końcem textDidChange. Jak już wspomniałem w tytule, ostrzeżenie to:

There are visible views left after reusing them all: { (null) = (null); }

Czy ktoś wie dlaczego tak się dzieje i jak go rozwiązać?

+0

Mam ten sam problem w podobny sposób delegate pole tekstowe: 'func textField (textField: UITextField, shouldChangeCharactersInRange zakres: NSRange, replacementString ciąg: String) -> Bool'. Ponieważ w Internecie nie ma żadnych informacji na ten temat, ten komiks xkcd dokładnie opisuje, jak się czuję: http://static.fjcdn.com/pictures/Dhat+did+you+see_a484fb_4909175.jpg – Losiowaty

Odpowiedz

10

Miałem podobny problem z widokiem nagłówka sekcji z niestandardowym UITextField. Pozbyłem się ostrzeżenia wywołując resignFirstResponder w polu tekstowym przed ponownym wczytaniem danych widoku tabeli i wywołaniem becomeFirstResponder po operacji ponownego ładowania. Coś w rodzaju:

// Workaround: hide and show keyboard to prevent warning when reloading results 
[self.searchTextField resignFirstResponder]; 
[self.tableView reloadData]; 
[self.searchTextField becomeFirstResponder]; 
+0

To zasługuje na więcej głosów, to ma podsłuchiwał mnie od tygodni i do tej pory wszystko, co udało mi się znaleźć, to ludzie, którzy twierdzą, że nie możesz nic z tym zrobić! – Kris

+0

Dla mnie dodanie tych klawiszy sprawia, że ​​klawisze się ukrywają i nie pojawiają się ponownie. Podobnie jak w przypadku metody Frisestesponder nie zostanie uruchomione w ogóle ...:/ – Fengson

2

Podczas gdy druga odpowiedź została usunięta z błędu umieszczonego w konsoli, miała również pewne niezamierzone konsekwencje. Głównie wywoływanie metody resignFirstResponder, a następnie FirstResponder w ten sposób resetuje stan klawiatury. Więc jeśli wpiszesz literę, klawiatura zresetuje się do Alpha z Numeric. Staje się to denerwujące, jeśli próbujesz wpisać ciąg liter.

W moim przypadku stwierdziłem, że błąd There are visible views left after reusing them all: { (null) = (null); } został zarejestrowany tylko wtedy, gdy mój zestaw UISearchBar został ustawiony na nagłówek sekcji TableView. Robiłem to, aby pasek wyszukiwania unosił się u góry UITableViewController.

Zamiast tego refaktoryzowałem, aby użyć kontrolera UIViewController, umieściłem UISearchBar na górze i UITableView pod nim to wydaje się, że poprawnie naprawiło problem.

+0

To samo rozwiązanie pomogło w moim przypadku. Pomysł z wywołaniem sekwencji 'resignFirstResponder'' reloadData' 'becomeFirstResponder', wydawał się zbyt hackowy. – Michael