klawiatura iPada nie zostanie odrzucona, jeśli styl prezentacji modal ViewController jest UIModalPresentationFormSheet
Uwaga:
Zobacz zaakceptowaną odpowiedź (Nie top głosował jeden) na rozwiązanie od iOS 4.3.
To pytanie dotyczy zachowania wykrytego w klawiaturze iPada, w którym odmawia się odrzucenia, jeśli zostanie wyświetlone w modalnym oknie dialogowym z kontrolerem nawigacyjnym.
Zasadniczo, jeśli przedstawię Kontroler nawigacyjny z następującą linią jak poniżej:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
[[5]}klawiatura odmawia zwolnienia. Jeśli skomentuję tę linię, klawiatura zniknie dobrze.
...
Mam dwa pola tekstowe, nazwę użytkownika i Hasło; Nazwa użytkownika ma przycisk Dalej, a hasło przycisk Gotowe. Klawiatura nie zniknie, jeśli przedstawię to w modalnym kontrolerze nawigacyjnym.
Prace
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 nawigacyjnego i przedstawię "b" jako kontroler widoku modalnego, to zadziała. Czy kontroler nawigacji jest problem?
Prace
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
Prace
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
13 answers
W viewcontrollerze, który jest prezentowany modalnie wystarczy nadpisać disablesAutomaticKeyboardDismissal, aby zawsze zwrócić NO
- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 16:22:34
[[1]}to zostało sklasyfikowane jako "działa zgodnie z przeznaczeniem" przez inżynierów Apple. Jakiś czas temu zgłosiłem błąd. Ich rozumowanie jest to, że użytkownik jest często będzie wprowadzanie danych w formie modalnej, więc starają się być "pomocny" i keyboard widoczne, gdzie zwykle różne przejścia w widoku modalnym może spowodować klawiatura pokazać/ukryć wielokrotnie.
[[1]} Edit: oto odpowiedź inżyniera Apple na forach programistów:Was your view by jakieś szanse przedstawione z uimodalpresentationformsheet stylu? Aby uniknąć częstych animacji wewnątrz i na zewnątrz, klawiatura czasami pozostanie na ekranie, nawet jeśli nie ma pierwszej odpowiedzi. To nie jest błąd.
To przysparza wielu ludziom problemów (w tym mnie), ale w tej chwili nie wydaje się, aby można było to obejść.
UPDATE:
W iOS 4.3 i nowszych, możesz teraz zaimplementować ` - disablesAutomaticKeyboardDismissal ' na widoku kontroler zwracający nr:
- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}
To rozwiązuje problem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-27 14:55:24
Bądź ostrożny, jeśli wyświetlasz modal za pomocą UINavigationController
. Następnie należy ustawić disablesAutomaticKeyboardDismissal
na kontrolerze nawigacji, a nie na kontrolerze widoku. Możesz to łatwo zrobić za pomocą kategorii.
#import <Foundation/Foundation.h>
@interface UINavigationController (KeyboardDismiss)
- (BOOL)disablesAutomaticKeyboardDismissal;
@end
Plik: UINavigationController+KeyboardDismiss.m
#import "UINavigationController+KeyboardDismiss.h"
@implementation UINavigationController(KeyboardDismiss)
- (BOOL)disablesAutomaticKeyboardDismissal
{
return NO;
}
@end
Nie zapomnij zaimportować kategorii do pliku, w którym używasz UINavigationController.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-26 20:12:47
Rozwiązałem to, używając stylu prezentacji UIModalPresentationPageSheet
i zmieniając jego rozmiar natychmiast po przedstawieniu. TAK:
viewController.modalPresentationStyle = UIModalPresentationPageSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:viewController animated:YES];
viewController.view.superview.autoresizingMask =
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin;
viewController.view.superview.frame = CGRectMake(
viewController.view.superview.frame.origin.x,
viewController.view.superview.frame.origin.y,
540.0f,
529.0f
);
viewController.view.superview.center = self.view.center;
[viewController release];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 11:30:40
Jeśli przełączysz inny wyświetlacz modalny, klawiatura zniknie. Nie jest ładny i nie ożywia się, ale możesz go usunąć.
Byłoby świetnie, gdyby była poprawka, ale na razie to działa. Możesz zaklinować go w kategorii naUIViewController
i wywołać, gdy chcesz, aby klawiatura zniknęła:
@interface _TempUIVC : UIViewController
@end
@implementation _TempUIVC
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
@end
@implementation UIViewController (Helpers)
- (void)_dismissModalViewController {
[self dismissModalViewControllerAnimated:NO];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
[self release];
}
- (void)forceKeyboardDismissUsingModalToggle:(BOOL)animated {
[self retain];
_TempUIVC *tuivc = [[_TempUIVC alloc] init];
tuivc.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:tuivc animated:animated];
if (animated) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_dismissModalViewController) name:UIKeyboardDidHideNotification object:nil];
} else
[self _dismissModalViewController];
[tuivc release];
}
@end
Bądź z tym ostrożny, gdy przeglądaszdidappear / viewDidDisappear i wszystkie te metody są wywoływane. Jak mówiłem, nie jest ładny, ale robi praca.
- Adam
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-09 12:59:54
Możesz również obejść to w uniwersalnej aplikacji, po prostu sprawdzając idiom, a jeśli jest to iPad, nie wyskakuj automatycznie na klawiaturze i pozwól użytkownikowi dotknąć tego, co chce edytować.
Może nie jest to najładniejsze rozwiązanie, ale jest bardzo proste i nie wymaga żadnych wymyślnych hacków, które zerwą się wraz z następnym dużym wydaniem iOS:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 22:38:02
Dla tych, którzy mają problemy z UINavigationController, zobacz moją odpowiedź na podobne pytanie tutaj: https://stackoverflow.com/a/10507689/321785
Edytuj: Uważam to za poprawę rozwiązania Miha Hribar (ponieważ decyzja odbywa się tam, gdzie powinna), a w przeciwieństwie do komentarza Pascala dotyczącego kategorii na UIViewController
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:56
Umieść ten kod w widoku willdisappear: metoda bieżącego kontrolera jest innym sposobem na naprawienie tego:
Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");
id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)];
[activeInstance performSelector:@selector(dismissKeyboard)];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-24 09:08:07
Jestem pewien, że na to spojrzałeś, ale jesteś pewien, że twoja klasa kontrolerów jest prawidłowo podłączona jako delegat UITextField, prawda?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-01 04:58:24
może nie zwracaj nie, ale tak. Więc może odejść.
I masz textFieldShouldEndEditing
zwrot tak, jak również?
i Dlaczego strzelasz ?! sorry I see now
Czy możemy założyć, że żaden z nich nie ma przypadkiemMam też kilka UITextViews które wszystkie mają swoje " edytowalne" właściwość ustawiona na FALSE.
tag
wartości secondField.tag+1
? Jeśli tak, to mówisz im, aby zostali ratownikami, zamiast rezygnować z pierwszego / align = "left" / Może Wrzuć nslog () do struktury if.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-01 10:41:33
Może nie jest idealnym rozwiązaniem, ale działa
[self.view endEditing: YES];
z dowolnego miejsca zaimplementowany jest przycisk lub gest, aby przedstawić modal
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 08:41:12
Odkryłem, że disablesAutomaticKeyboardDismissal
i dodanie disablesAutomaticKeyboardDismissal
funkcji nie działa dla mojego UITextField
w modalnym oknie dialogowym.
Moim rozwiązaniem byłowyłączenie wszystkich kontrolek wprowadzania tekstu w moim oknie dialogowym, a następnie ponowne włączenie odpowiednich w ułamek sekundy później.
Wydaje się, że gdy iOS widzi, że żaden z UITextField
kontrolek nie jest włączony, to robi pozbyć się klawiatury.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-22 08:12:08
Swift 4.1:
extension UINavigationController {
override open var disablesAutomaticKeyboardDismissal: Bool {
return false
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 05:29:42