2009-05-20 14 views
14

Nie jestem pewien, dlaczego to jest takie trudne. Mam UISearchBar na górze mojej strony. Kiedy użytkownik wpisze w ten UISearchBar, automatycznie odfiltruje wyniki w UITableView pod paskiem wyszukiwania. Nie ma potrzeby szukania przycisku, ponieważ szukam, gdy klawisze są wciśnięte.Ukryj klawiaturę po utracie ostrości UISearchBar

Przepływ aplikacji polega na tym, że użytkownik wpisuje wyszukiwanie w pasku wyszukiwania (przy wyświetlonej klawiaturze), a następnie przewija wyniki w widoku tabeli - w którym momencie klawiatura musi zniknąć.

Trudno jest usunąć klawiaturę.

wiem, że trzeba zrobić:

[searchBar resignFirstResponder]; 

uzyskać klawiatury do zniknąć, ale nie mogę znaleźć tego delegat muszę wykonać to dalej. Chcę to zrobić, gdy tylko użytkownik dotknie widoku tabeli.

Wszelkie pomysły?

+0

Sprawdź to: http://stackoverflow.com/questions/7482266/resign-keyboard-when-losing-focus- on-uisearchbar – alternatiph

Odpowiedz

1

Możesz chcieć zrobić to tak, jak robi to Cydia (jailbreak pakujący interfejs użytkownika) - znajduje się przycisk wyszukiwania, a po naciśnięciu przycisku wyszukiwania zamyka się klawiatura. Wyniki są nadal filtrowane podczas pisania w celu wyświetlenia podglądu.

+1

To wymagałoby naciśnięcia przycisku wyszukiwania, aby usunąć klawiaturę - krok, który moim zdaniem powinien być niepotrzebny i może po prostu frustruć użytkowników. W każdym razie dzięki. – rein

9

Spróbuj tego:

- (void)viewWillDisappear:(BOOL)animated { 

    [super viewWillDisappear:animated]; 

    [searchBar resignFirstResponder]; 

} 

on pracował dla mnie

2

myślę najprostszy (i najlepszym) sposobem na to jest do podklasy globalnego widoku i używać hitTest: metodę withEvent słuchać dowolny dotknąć. Dotyki na klawiaturze nie są rejestrowane, więc hitTest: withEvent jest wywoływany tylko po dotknięciu/przewinięciu/przesunięciu/przyciśnięciu ... gdzie indziej, a następnie wywołanie [self endEditing: YES].

Jest to lepsze rozwiązanie niż w przypadku dotknięćBegan, ponieważ dotknięciaBegan nie są wywoływane, jeśli klikniesz przycisk w górnej części widoku. Jest również lepszy niż przy użyciu przyciemnionego ekranu, ponieważ w złożonym i dynamicznym interfejsie użytkownika nie można umieścić przyciemnionego ekranu w dowolnym miejscu. Ponadto, jest to lepsze niż wywołanie [searchBar resignFirstResponder], ponieważ możesz mieć wiele pól tekstowych na ekranie, więc to działa dla nich wszystkich.

0

Może być bardzo późno, aby odpowiedzieć, ale to może pomóc każdemu w przyszłości. Ten konkretny kawałek kodu pracował dla mnie. P.S. Nie jestem właścicielem tego rozwiązania, znalezionego jakiś czas temu w samej sieci.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [[event allTouches] anyObject]; 
if ([self.srchBar isFirstResponder] && [touch view] != self.srchBar) 
{ 
    [self.srchBar resignFirstResponder]; 
} 
[super touchesBegan:touches withEvent:event]; 
} 
1

Ponieważ wyniki będą w widoku tabeli, użyj UIScrollView „s delegata (do którego UITableView reaguje) metodę - (void)scrollViewDidScroll:(UIScrollView *)scrollView.

Musisz mieć widok kontrolera reagować pozyskać UITableView „s danych i delegata (w pliku .h):

<UITableViewDataSource, UITableViewDelegate> 

niż w swojej metody inicjalizacji w dodatku .m Plik:

self.tableView.dataSource = self; 
self.tableView.delegate = self; 

Wreszcie, dodać tę metodę:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    [self.view endEditing:YES]; 
} 

To spowoduje utratę ostrości przez UISearchBar, a klawiatura się ukryje.

1

Jedną z możliwości jest to, że UISearchBar należy do kontrolera, który jest wyświetlany w UIModalPresentationFormSheet. Miałem ten sam problem i okazało się, że jest to związane z metodą "disablesAutomaticKeyboardDismissal" UIViewController.

The Apple documentation stwierdza co następuje:

zastąpić tę metodę w podklasie, aby zezwolić lub nie zezwolić na zwolnienie bieżącego widoku wejścia (zwykle klawiatury systemowej) przy zmianie z kontrolą, która chce wejście do tego, który tego nie robi. Zgodnie z normalną sytuacją, gdy użytkownik dotknie kontrolki wymagającej widoku wejściowego , system automatycznie wyświetli ten widok. Stuknięcie w formantu , który nie chce widoku wejściowego, powoduje później zwolnienie bieżącego widoku wejściowego, ale może nie we wszystkich przypadkach. Możesz zastąpić tę metodę w tych nierozstrzygniętych przypadkach, aby zezwolić na odrzucenie widoku wejściowego lub użyć tej metody, aby uniemożliwić odwołanie widoku w innych przypadkach.

Domyślna implementacja tej metody zwraca TAK gdy modalne prezentacja styl kontrolera widok jest ustawiony na UIModalPresentationFormSheet i nie zwraca na innych prezentacji stylów. W związku z tym system zwykle nie pozwala na odrzucenie klawiatury w przypadku formularzy modalnych.

W moim przypadku wyświetlany pasek wyszukiwarki w pasku nawigacyjnym, więc musiałem utworzyć podklasę UINavigationViewController że przesłania metodę następująco:

- (BOOL)disablesAutomaticKeyboardDismissal { 
    return NO; 
} 

Po tym resignFirstResponder wreszcie uczynić klawiatura znika.

0

Biorąc rzutem ze zmienną searchBar, dodać tę metodę do widoku:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
{ 
    if searchBar.isFirstResponder && !searchBar.point(inside: point, with: event){ 
     searchBar.resignFirstResponder() 
    } 
    return super.hitTest(point, with: event) 
} 
Powiązane problemy