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];
Author: Irfan, 2010-07-30

13 answers

W viewcontrollerze, który jest prezentowany modalnie wystarczy nadpisać disablesAutomaticKeyboardDismissal, aby zawsze zwrócić NO

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}
 114
Author: Sebastian H,
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.

 172
Author: Mike Weller,
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.

Plik: UINavigationController+KeyboardDismiss.h
#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.

 149
Author: Miha Hribar,
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];
 51
Author: azdev,
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 na UIViewController 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

 1
Author: 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:)

 1
Author: Maciej Swic,
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

 1
Author: Chris Trahey,
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)];
 1
Author: Story,
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?

 0
Author: Neal L,
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

Mam też kilka UITextViews które wszystkie mają swoje " edytowalne" właściwość ustawiona na FALSE.

Czy możemy założyć, że żaden z nich nie ma przypadkiem 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.
 0
Author: mvds,
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

 0
Author: Tanuj Jagoori,
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.

[[4]}klawiatura ekranowa po prostu nie chciała odejść.

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.

 0
Author: Mike Gledhill,
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
   }
}
 0
Author: fivewood,
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