Uwaga:
Zobacz zaakceptowaną odpowiedź (nie wybraną najlepiej) dla rozwiązania z iOS 4.3.
To pytanie dotyczy zachowania wykrytego na klawiaturze iPada, gdzie odmawia odrzucenia, jeśli jest pokazane w modalnym oknie dialogowym z kontrolerem nawigacyjnym.
Zasadniczo, jeśli przedstawię kontrolerowi nawigacji następujący wiersz:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
Klawiatura odmawia zwolnienia. Jeśli skomentuję ten wiersz, klawiatura zniknie.
...
Mam dwa pola tekstowe, nazwę użytkownika i hasło; nazwa użytkownika ma przycisk Dalej, a hasło ma przycisk Gotowe. Klawiatura nie zniknie, jeśli przedstawię to w modalnym kontrolerze nawigacyjnym.
PRACUJE
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
NIE DZIAŁA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Jeśli usunę część kontrolera nawigacji i sam przedstawię „b” jako kontroler widoku modalnego, to zadziała. Czy problem stanowi kontroler nawigacji?
PRACUJE
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
PRACUJE
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
UINavigationController
klasy. Twoje zdrowie.resignFirstResponder
to działa, ale klawiatura wciąż jest wyświetlana. Mój scenariusz (PresentFormSheet with navig contrllr) jest dokładnie taki sam jak twój. Wielkie dzięki !!Odpowiedzi:
W kontrolerze widoku, który jest prezentowany modalnie, po prostu przesłoń,
disablesAutomaticKeyboardDismissal
aby zwrócićNO
:źródło
Zostało to sklasyfikowane przez inżynierów Apple jako „działa zgodnie z przeznaczeniem”. Jakiś czas temu zgłosiłem błąd. Ich rozumowanie polega na tym, że użytkownik często wprowadza dane w formie modalnej, więc stara się być „pomocny” i utrzymywać klawiaturę widoczną tam, gdzie zwykle różne przejścia w widoku modalnym mogą powodować wielokrotne pokazywanie / ukrywanie klawiatury.
edycja: oto odpowiedź inżyniera Apple na forach programistów:
Daje to wielu ludziom problemy (łącznie ze mną), ale w tej chwili wydaje się, że nie ma sposobu na obejście tego.
AKTUALIZACJA:
W iOS 4.3 i nowszych możesz teraz zaimplementować `-disablesAutomaticKeyboardDismissal 'na kontrolerze widoku, aby zwrócić NIE:
To rozwiązuje problem.
źródło
UINavigationController
podklasę, która będzie nadpisywać,disablesAutomaticKeyboardDismissal
aby powrócićNO
i używać jej jako kontrolera nawigacji podczas prezentacji modalnego arkusza formularza. Zobacz odpowiedź @ miha-hribar poniżej.Bądź ostrożny, jeśli wyświetlasz modal za pomocą
UINavigationController
. Następnie należy ustawićdisablesAutomaticKeyboardDismissal
na kontrolerze nawigacyjnym, a nie na kontrolerze widoku. Możesz to łatwo zrobić za pomocą kategorii.Plik: UINavigationController + KeyboardDismiss.h
Plik: UINavigationController + KeyboardDismiss.m
Nie zapomnij zaimportować kategorii do pliku, w którym używasz UINavigationController.
źródło
disablesAutomaticKeyboardDismissal
zUINavigationController
nie własnego kontrolera widoku, aby rozwiązać ten problem.Rozwiązałem ten problem, używając
UIModalPresentationPageSheet
stylu prezentacji i zmieniając jego rozmiar natychmiast po jego prezentacji. Tak jak:źródło
Jeśli przełączysz inny wyświetlacz modalny, możesz sprawić, że klawiatura zniknie. Nie jest ładna i nie ożywia, ale możesz sprawić, że odejdzie.
Byłoby wspaniale, gdyby była poprawka, ale na razie to działa. Możesz zaklinować go w kategorii
UIViewController
i zadzwonić, kiedy chcesz, aby klawiatura zniknęła:Bądź ostrożny z tym podczas przeglądaniaDidAppear / viewDidDisappear i wszystkie te metody zostaną wywołane. Jak powiedziałem, nie jest ładny, ale działa.
-Adam
źródło
Możesz również obejść ten problem w uniwersalnej aplikacji, po prostu sprawdzając idiom, a jeśli jest to iPad, w ogóle nie otwieraj klawiatury automatycznie i pozwól użytkownikowi dotknąć tego, co chce edytować.
Może nie jest to najlepsze rozwiązanie, ale jest bardzo proste i nie wymaga żadnych wymyślnych hacków, które zepsują się w następnej wersji iOS :)
źródło
Umieść ten kod w widokuWillDisappear: metoda bieżącego kontrolera to inny sposób, aby to naprawić:
źródło
Przekonałem się, że
disablesAutomaticKeyboardDismissal
dodaniedisablesAutomaticKeyboardDismissal
funkcji nie działa w moim przypadkuUITextField
modalnym oknie dialogowym.Klawiatura ekranowa po prostu nie zniknie.
Moim rozwiązaniem było wyłączenie wszystkich elementów sterujących wprowadzaniem tekstu w moim oknie dialogowym, a następnie ponowne włączenie odpowiednich ułamków sekundy później.
Wydaje się, że gdy iOS widzi, że żadna z
UITextField
kontroli są włączone, to nie pozbyć klawiaturze.źródło
Jestem pewien, że na to spojrzałeś, ale masz pewność, że twoja klasa kontrolera jest poprawnie podłączona jako delegat UITextField, prawda?
źródło
może nie zwracaj NIE, ale TAK. Więc może odejść.
I masz
textFieldShouldEndEditing
powracasz TAK?A dlaczego strzelaszprzepraszam, widzę teraz[nextResponder becomeFirstResponder]
?Czy możemy założyć, że żaden z nich nie ma
tag
wartościsecondField.tag+1
? Jeśli tak, mówisz im, aby zostali pierwszymi osobami odpowiadającymi, zamiast rezygnować z pierwszego odpowiadającego. Być może wstawmy trochę NSLog () do tej struktury if.źródło
NSLog("tf %x / method ...",textField);
we wszystkich funkcjach delegowania?Dla tych, którzy mają problemy z UINavigationController, zobacz moją odpowiedź na podobne pytanie tutaj: https://stackoverflow.com/a/10507689/321785
Edycja: Uważam to za ulepszenie rozwiązania Miha Hribar (ponieważ decyzja jest podejmowana tam, gdzie powinna), a nie komentarz Pascala dotyczący kategorii na UIViewController
źródło
może nie być idealnym rozwiązaniem, ale działa
[self.view endEditing: YES];
skądkolwiek zaimplementowany jest Twój przycisk lub gest, aby zaprezentować modalność
źródło
źródło