Como posso verificar programaticamente se um teclado está presente no aplicativo iOS?

111

Preciso verificar a condição de visibilidade do teclado em meu aplicativo iOS.

Pseudo-código:

if(keyboardIsPresentOnWindow) {
    //Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
    //Do action 2
}

Como posso verificar essa condição?

Jitendra Singh
fonte
Qual app? Que lingua? Qual plataforma? Meu melhor palpite é iPhone?
Nick Bedford,
4
Questão corrigida. Que os jogos comecem!
Robert Harvey,
Talvez este
Peter Wong

Respostas:

68

… Ou use o caminho mais fácil:

Quando você insere um textField, ele se torna o primeiro a responder e o teclado aparece. Você pode verificar o status do teclado com [myTextField isFirstResponder]. Se ele retornar YES, o teclado está ativo.

thpitsch
fonte
21
Boa solução, no entanto, NÃO funcionará se um teclado físico for usado (o que não é incomum no iPad).
Andrei Herford,
4
Isso não responde à pergunta. Isso informa se o campo de texto é o primeiro a responder. Eu tenho um controlador de exibição com vários controladores de exibição filho, todos os quais contêm UITextFields. Usando este método, não posso dizer do meu controlador de visualização pai se o teclado é mostrado. A única maneira confiável é usar o método de notificação explicado nas outras respostas
TimWhiting
63

O código do Drawnonward é muito parecido, mas colide com o namespace do UIKit e poderia ser mais fácil de usar.

@interface KeyboardStateListener : NSObject {
    BOOL _isVisible;
}
+ (KeyboardStateListener *)sharedInstance;
@property (nonatomic, readonly, getter=isVisible) BOOL visible;
@end

static KeyboardStateListener *sharedInstance;

@implementation KeyboardStateListener

+ (KeyboardStateListener *)sharedInstance
{
    return sharedInstance;
}

+ (void)load
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    sharedInstance = [[self alloc] init];
    [pool release];
}

- (BOOL)isVisible
{
    return _isVisible;
}

- (void)didShow
{
    _isVisible = YES;
}

- (void)didHide
{
    _isVisible = NO;
}

- (id)init
{
    if ((self = [super init])) {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(didHide) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

@end
Rpetrich
fonte
4
Por que ele precisa de sua própria piscina?
Dan Rosenstark 01 de
18
+loadé um método especial chamado pelo tempo de execução Objective-C. Ele é chamado para cada classe depois que o binário do aplicativo é carregado, mas antes que a main()função seja inserida. Não há garantia de que um pool de liberação automática estará ativo.
rpetrich
1
MattDiPasquale: Se o método + load for excluído, sharedInstance nunca será inicializado. Como não há garantia de que um pool de liberação automática esteja ativo quando o tempo de execução invocar um método + load, agrupar todas as chamadas para classes fornecidas pelo sistema é necessário no caso de chamarem a liberação automática.
rpetrich
3
Boa resposta! Eu sei que isso tem vários anos, mas agora o NSAutoreleasePool alloc/ releasepode ser substituído cercando o código em@autoreleasepool { }
chown
3
Não se esqueça de remover o Observer, provavelmente no dealloc do KeyboardStateListener.
SushiGrass Jacob
32

Crie um UIKeyboardListenerquando souber que o teclado não está visível, por exemplo, ligando [UIKeyboardListener shared]de applicationDidFinishLaunching.

@implementation UIKeyboardListener

+ (UIKeyboardListener) shared {
    static UIKeyboardListener sListener;    
    if ( nil == sListener ) sListener = [[UIKeyboardListener alloc] init];

    return sListener;
}

-(id) init {
    self = [super init];

    if ( self ) {
        NSNotificationCenter        *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(noticeShowKeyboard:) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(noticeHideKeyboard:) name:UIKeyboardWillHideNotification object:nil];
    }

    return self;
}

-(void) noticeShowKeyboard:(NSNotification *)inNotification {
    _visible = true;
}

-(void) noticeHideKeyboard:(NSNotification *)inNotification {
    _visible = false;
}

-(BOOL) isVisible {
    return _visible;
}

@end
KlimczakM
fonte
Nota: Você pode usar +(void)loadpara chamar init nesta classe de ouvinte para que funcione genericamente como arrastar e soltar em qualquer projeto e inicializar a partir da segunda inicialização do aplicativo, em vez de você ter que se lembrar de iniciá-lo em qualquer lugar.
Albert Renshaw
30

Acho que você precisa usar as notificações fornecidas sobre o teclado:

De: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html

Notificações de teclado

Quando o sistema mostra ou oculta o teclado, ele publica várias notificações do teclado. Essas notificações contêm informações sobre o teclado, incluindo seu tamanho, que você pode usar para cálculos que envolvem visualizações móveis. O registro dessas notificações é a única maneira de obter alguns tipos de informações sobre o teclado. O sistema fornece as seguintes notificações para eventos relacionados ao teclado:

* UIKeyboardWillShowNotification
* UIKeyboardDidShowNotification
* UIKeyboardWillHideNotification
* UIKeyboardDidHideNotification

Para obter mais informações sobre essas notificações, consulte suas descrições em Referência de classe UIWindow. Para obter informações sobre como mostrar e ocultar o teclado, consulte Texto e web.

Beggs
fonte
Eu verifiquei essas notificações, mas não sei como verificar essas notificações. Se você pudesse postar algum exemplo, isso seria muito útil.
Jitendra Singh
2
Dê uma olhada no NSNotificationCenter. Você terá que se registrar para receber as notificações de seu interesse. Não se esqueça de cancelar o registro quando seu aplicativo for encerrado.
Thomas Müller
13

Implementação Swift 3

    import Foundation
class KeyboardStateListener: NSObject
{
    static let shared = KeyboardStateListener()
    var isVisible = false

    func start() {
        NotificationCenter.default.addObserver(self, selector: #selector(didShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func didShow()
    {
        isVisible = true
    }

    func didHide()
    {
        isVisible = false
    } 
}
Christos Chadjikyriacou
fonte
1
Eu recomendo remover o observador no deinit ou se for um controlador de visualização em visualização desaparecerá
Juan Boero
3
Não faz sentido usar um deinit se este for um singleton porque ele nunca será deinido
Sirenes
11

Usar a hierarquia de subvisualização da janela como indicação para exibição do teclado é um hack. Se a Apple mudar sua implementação subjacente, todas essas respostas falharão.

A maneira correta seria monitorar a exibição do teclado e ocultar notificações em todo o aplicativo, como dentro do seu App Delegate:

Em AppDelegate.h:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (assign, nonatomic) BOOL keyboardIsShowing;

@end

Em AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Monitor keyboard status application wide
    self.keyboardIsShowing = NO;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];

    return YES;
}

- (void)keyboardWillShow:(NSNotification*)aNotification
{
    self.keyboardIsShowing = YES;
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    self.keyboardIsShowing = NO;
}

Então você pode verificar usando:

BOOL keyboardIsShowing = ((AppDelegate*)[UIApplication sharedApplication].delegate).keyboardIsShowing;

Deve-se observar que as notificações de exibição / ocultação do teclado não serão disparadas quando o usuário estiver usando um bluetooth ou teclado externo.

Vlad
fonte
10

Adicionar uma extensão

extension UIApplication {
    /// Checks if view hierarchy of application contains `UIRemoteKeyboardWindow` if it does, keyboard is presented
    var isKeyboardPresented: Bool {
        if let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow"),
            self.windows.contains(where: { $0.isKind(of: keyboardWindowClass) }) {
            return true
        } else {
            return false
        }
    }
}

Em seguida, verifique se o teclado está presente,

if UIApplication.shared.isKeyboardPresented {
     print("Keyboard presented")
} else { 
     print("Keyboard is not presented")
}
Kay Cee
fonte
Posso fazerguard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Clay Bridges
5

Isto é do iOS Text Programming Guide publicado pela Apple aqui: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

Basicamente, chame "registerForKeyBoardNotifications" em seu ViewDidLoad. Então, toda vez que o teclado se torna ativo, "keyboardWasShown" é chamado. E toda vez que o teclado desaparece, "keyboardWillBeHidden" é chamado.

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
    NSLog(@"Keyboard is active.");
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
    NSLog(@"Keyboard is hidden");
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}
Scuttle
fonte
5

Agora, no iOS8, essa solução obviamente não funciona. Ele foi escrito inicialmente para IOS4 / 5.

Experimente esta solução:

- (BOOL) isKeyboardOnScreen 
{
    BOOL isKeyboardShown = NO;

    NSArray *windows = [UIApplication sharedApplication].windows;
    if (windows.count > 1) {
        NSArray *wSubviews =  [windows[1]  subviews];
        if (wSubviews.count) {
            CGRect keyboardFrame = [wSubviews[0] frame];
            CGRect screenFrame = [windows[1] frame];
            if (keyboardFrame.origin.y+keyboardFrame.size.height == screenFrame.size.height) {
                isKeyboardShown = YES;
            }
        }
    }

    return isKeyboardShown;
}
malex
fonte
2
É inválido supor que várias janelas implicam em um teclado e que o teclado sempre é o segundo elemento.
jmah de
1
@jmah Claro que não é a abordagem universal, mas cobre uma grande quantidade de casos de aplicação. Qualquer tentativa de obter informações sobre o teclado usa alguma hierarquia de visão específica porque a Apple não fornece nenhuma API útil para este caso.
malex
Isso não funciona, o que funcionou para mim foi iterar por todas as visualizações e para todos os UITextFields ou UITextView verificar se eles são os primeiros a responder ... se algum deles retornar teclado verdadeiro estiver visível, caso contrário, não será
e
4

Algumas observações:

O padrão recomendado para um objeto singleton seria o seguinte. dispatch_once certifica-se de que a classe seja inicializada uma vez de maneira thread-safe e a variável estática não seja visível do lado de fora. E é GCD padrão, então não há necessidade de saber sobre detalhes de baixo nível de Objective-C.

+ (KeyboardStateListener *)sharedInstance
{
    static KeyboardStateListener* shared;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[KeyboardStateListener alloc] init];
        // Other initialisations
    });

    return shared;
}

Normalmente você não quer saber apenas se o teclado está visível ou não, mas quão grande ele é. Nem todos os teclados têm o mesmo tamanho. Os teclados do iPhone são menores do que os teclados do iPad. Portanto, você deseja outra propriedade @property (readonly, nonatomic) CGRect keyboardRect;definida no método NoticeShowKeyboard: como este:

NSValue* value = notification.userInfo [UIKeyboardFrameEndUserInfoKey];
_keyboardRect = value.CGRectValue;

Importante notar que o retângulo está nas coordenadas UIWindow e não respeita a rotação da tela. Assim, o chamador converteria esse retângulo chamando

KeyboardStateListener* listener = [KeyboardStateListener sharedInstance];
CGRect windowRect = listener.keyboardRect;
CGRect viewRect = [myView convertRect:windowRect fromView:self.window];

Se o usuário girar a tela enquanto o teclado estiver visível, o aplicativo será informado de que o teclado está oculto e será mostrado novamente. Quando é mostrado, outras visualizações provavelmente ainda não foram giradas. Portanto, se você mesmo observar eventos de ocultar / mostrar do teclado, converta as coordenadas quando realmente precisar delas, não na notificação.

Se o usuário dividir ou desencaixar o teclado, ou usar um teclado físico, as notificações sempre mostrarão o teclado como oculto. Desencaixar ou mesclar o teclado enviará uma notificação de "teclado mostrado".

O ouvinte deve ser inicializado enquanto o teclado está oculto, caso contrário, a primeira notificação será perdida e será assumido que o teclado está oculto quando não está.

Portanto, é muito importante saber o que você realmente deseja. Este código é útil para tirar coisas do caminho do teclado (com um teclado dividido ou desencaixado, isso é responsabilidade do usuário). Não informa se o usuário pode ver um teclado na tela (no caso de um teclado dividido). Não informa se o usuário pode digitar (por exemplo, quando há um teclado físico). Olhar para outras janelas não funciona se o aplicativo criar outras janelas por conta própria.

Chris
fonte
Bons avisos sobre teclado no iPad, obrigado!
JOM
3

Implementação rápida :

class KeyboardStateListener: NSObject
{
  static var shared = KeyboardStateListener()
  var isVisible = false

  func start() {
    let nc = NSNotificationCenter.defaultCenter()
    nc.addObserver(self, selector: #selector(didShow), name: UIKeyboardDidShowNotification, object: nil)
    nc.addObserver(self, selector: #selector(didHide), name: UIKeyboardDidHideNotification, object: nil)
  }

  func didShow()
  {
    isVisible = true
  }

  func didHide()
  {
    isVisible = false
  } 
}

Como o swift não executa o método de carregamento de classe na inicialização, é importante iniciar este serviço na inicialização do aplicativo:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
  ...    
  KeyboardStateListener.shared.start() 
}
Prcela
fonte
Usando o iOS 13, swift 5.0 neste último bit, a carga de aula não parece ser necessária?
user3069232
3

Esta é a minha solução, ela encapsula tudo em um único método estático e você pode chamá-lo de qualquer lugar para verificar:

+(BOOL)isKeyboardVisible{
    static id tokenKeyboardWillShow = nil;
    static id tokenKeyboardWillHide = nil;
    static BOOL isKbVisible = NO;
    @synchronized (self) {
        if (tokenKeyboardWillShow == nil){
            tokenKeyboardWillShow = [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
                @synchronized (self) {
                    isKbVisible = YES;
                }
            }];
        }

        if (tokenKeyboardWillHide == nil){
            tokenKeyboardWillHide = [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
                @synchronized (self) {
                    isKbVisible = NO;
                }
            }];
        }
    }

    return isKbVisible;
}
pthr
fonte
2

E aqui está como fazer isso em Swift:

 func registerForKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "keyboardWasShown:",
        name: UIKeyboardDidShowNotification,
        object: nil)

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "keyboardWillBeHidden:",
        name: UIKeyboardWillHideNotification,
        object: nil)
}

func keyboardWasShown(notification: NSNotification) {
    println("Keyboard was shown");
}

func keyboardWillBeHidden(notification: NSNotification) {
    println("Keyboard was dismissed");
}

Não se esqueça de cancelar o registro:

 override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardDidShowNotification,
        object: nil)

    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardWillHideNotification,
        object: nil)
}

E se você quiser dispensar o teclado ao pressionar o botão "Voltar":

class ViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var yourTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    registerForKeyboardNotifications()
    yourTextField.delegate = self
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}
Teodor Ciuraru
fonte
1

Experimente esta função

BOOL UIKeyboardIsVisible(){

BOOL keyboardVisible=NO;
// Locate non-UIWindow.
UIWindow *keyboardWindow = nil;
for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
    if (![[testWindow class] isEqual:[UIWindow class]]) {
        keyboardWindow = testWindow;
        break;
    }
}
// Locate UIKeyboard.
for (UIView *possibleKeyboard in [keyboardWindow subviews]) {
    // iOS 4 sticks the UIKeyboard inside a UIPeripheralHostView.
    if ([[possibleKeyboard description] hasPrefix:@"<UIPeripheralHostView"]) {
        keyboardVisible=YES;
    }
    if ([[possibleKeyboard description] hasPrefix:@"<UIKeyboard"]) {
        keyboardVisible=YES;
        break;
    }
}
return keyboardVisible;

}

de: iOS: Como acessar o `UIKeyboard`?

Vanguarder
fonte
1

BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Se retornar YES, o teclado está ativo.

Hardik Mamtora
fonte
1

Para verificar se o teclado do tempo é exibido, podemos usar as notificações predefinidas do teclado.

UIKeyboardDidShowNotification, UIKeyboardDidHideNotification

Por exemplo, posso usar o seguinte código para ouvir a notificação do teclado

// Ouça as aparências e desaparecimentos do teclado

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidHide:)
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

nos métodos, posso obter notificações

- (void)keyboardDidShow: (NSNotification *) notifyKeyBoardShow{
    // key board is closed
}

- (void)keyboardDidHide: (NSNotification *) notifyKeyBoardHide{
    // key board is opened
}
Manoj Singhal
fonte
1

Swift 4

extension UIViewController {
    func registerKeyboardNotifications() {
        let center = NotificationCenter.default
        center.addObserver(self, selector: #selector(keyboardWillBeShown(note:)), name: Notification.Name.UIKeyboardWillShow, object: nil)
        center.addObserver(self, selector: #selector(keyboardWillBeHidden(note:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
    }

    func removeKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)

    }

    @objc
    func keyboardWillBeShown(note: Notification) {}

    @objc
    func keyboardWillBeHidden(note: Notification) {}

}

final class MyViewController: UIViewController {

    // MARK: - Properties
    var isKeyboardVisible = false

    // MARK: - Life Cycle
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        registerKeyboardNotifications()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        removeKeyboardNotifications()
    }

    // MARK: - Keyboard Handling
    override func keyboardWillBeShown(note: Notification) {
        isKeyboardVisible = true
        let userInfo = note.userInfo
        let keyboardFrame = userInfo?[UIKeyboardFrameEndUserInfoKey] as! CGRect
        let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardFrame.height, 0.0)
        tableView.contentInset = contentInset
    }

   override func keyboardWillBeHidden(note: Notification) {
        tableView.contentInset = .zero
        isKeyboardVisible = false
   }

   // MARK: - Test
   fileprivate func test() {
        if isKeyboardVisible { // do something
        }
   }
}
Amber K
fonte
Funciona muito bem para mim (Xcode 10.2, Swift4) apenas curioso por que ninguém votou a favor disso?
infinity_coding7,
Não, isso não funciona se o teclado já foi apresentado por um controlador de visualização anterior.
Ricardo
0

Você pode verificar iterativamente todas as visualizações de texto, campos de texto e rótulos nas subvisualizações de uma visualização pai para ver se algum é o primeiro a responder com algo assim:

-(BOOL)isKeyboardActiveInView:(UIView *)view {
    for (UIView *anyView in [view subviews]) {
        if ([anyView isKindOfClass:[UITextField class]]) {
            if (((UITextField *)anyView).isFirstResponder) {
                return YES;
            }
        } else if ([anyView isKindOfClass:[UILabel class]]) {
            if (((UILabel *)anyView).isFirstResponder) {
                return YES;
            }
        } else if ([anyView isKindOfClass:[UITextView class]]) {
            if (((UITextView *)anyView).isFirstResponder) {
                return YES;
            }
        } else {
            if ([self isKeyboardActiveInView:anyView]) {
                return YES;
            }
        }
    }
    return NO;
}
Albert Renshaw
fonte
Isso falhará se você tiver controladores de visualização filho
Ricardo
-1

SWIFT 4.2 / SWIFT 5

class Listener {
   public static let shared = Listener()
   var isVisible = false

   // Start this listener if you want to present the toast above the keyboard.
   public func startKeyboardListener() {
      NotificationCenter.default.addObserver(self, selector: #selector(didShow), name: UIResponder.keyboardWillShowNotification, object: nil)
      NotificationCenter.default.addObserver(self, selector: #selector(didHide), name: UIResponder.keyboardWillHideNotification, object: nil)
   }

   @objc func didShow() {
     isVisible = true
   }

    @objc func didHide(){
       isVisible = false
    }
}
Amrit Sidhu
fonte
-5

Eu acho que isso pode te ajudar,

+(BOOL)isKeyBoardInDisplay  {

    BOOL isExists = NO;
    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows])   {
        if ([[keyboardWindow description] hasPrefix:@"<UITextEffectsWindow"] == YES) {
            isExists = YES;
        }  
    }

    return isExists;
}

obrigado,

Naveen Shan

Naveen Shan
fonte
1
No iOS 6, Only works ainda não apareceu! Uma vez que o teclado foi mostrado uma vez, ele para de funcionar.
James Laurenstin