LoginSignup
7
9

More than 5 years have passed since last update.

いつでもどこからでもキーボード表示状態を知るには

Last updated at Posted at 2015-03-16

はじめに

現在画面にキーボードが表示されているかを知る方法を調べました。

結論として、キーボードが出すNotificationをアプリ起動時から
監視し続けることで表示状態を知ることができそうです。

表示状態を取得するクラスを作成してみました。

参考になりましたら幸いです。

スクリーンショット 2015-03-16 12.18.01.png

キーボード状態リスナクラス

ヘッダ
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface XXXKeyboardStateListener : NSObject

+ (XXXKeyboardStateListener *)sharedInstance;

- (id)init __attribute__((unavailable("init is not available")));

- (BOOL)isHidden;

@end
実装
#import "XXXKeyboardStateListener.h"

@interface XXXKeyboardStateListener ()
{
    BOOL _hidden;
}

@end

@implementation XXXKeyboardStateListener

+ (XXXKeyboardStateListener *)sharedInstance
{
    static XXXKeyboardStateListener *sharedInstance;

    static dispatch_once_t once;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

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

        _hidden = YES;
    }
    return self;
}

- (void)dealloc
{
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center removeObserver:self];
}

- (BOOL)isHidden
{
    return _hidden;
}

- (void)didShow
{
    _hidden = NO;
}

- (void)didHide
{
    _hidden = YES;
}

@end

緩めのSingleton実装。
Prefixは適当に置換してください。

AppDelegateにてリスナクラスを初期生成

#import "XXXKeyboardStateListener.h"

@implementation XXXAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // キーボードリスナ生成(起動時から状態を監視するためここで生成)
    [XXXKeyboardStateListener sharedInstance];

    ...
}

使用時

    if ([[XXXKeyboardStateListener sharedInstance] isHidden]) {
        ...
    }

おわりに

ついでにSharedInstanceの扱いも調べ直しました。
実装こうした方が良いよという部分あったらコメント等で補完して頂けると嬉しいです!

参考

Managing the Keyboard

How to programatically check whether a keyboard is present in iphone app?

Objective-CのSingleton、その歴史的経緯など

Objective-C で継承可能な Singleton Class を作る

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9