LoginSignup
4
4

More than 5 years have passed since last update.

iPadのモーダルビューでQuickDialogを使うとキーボードが閉じない問題を回避

Posted at

設定画面などを少ない記述で作ることのできるライブラリ QuickDialog ですが、iPadのモーダルビューだとキーボードやピッカーが閉じてくれない問題が発生します(Version 0.8)。

AppDelegate.m
QRootElement *root = [[QRootElement alloc] init];

NSArray *component = @[@"A", @"B"];
QPickerElement *simplePickerEl = [[QPickerElement alloc] initWithTitle:@"Key" items:@[component] value:@"B"];

__weak QPickerElement *_simplePickerEl = simplePickerEl;
simplePickerEl.onValueChanged = ^(QRootElement *el){
    NSLog(@"Selected indexes: %@", [_simplePickerEl.selectedIndexes componentsJoinedByString:@","]);
};

QSection *simplePickerSection = [[QSection alloc] initWithTitle:@"Picker element"];
[simplePickerSection addElement:simplePickerEl];
[root addSection:simplePickerSection];

UINavigationController *navi = [QuickDialogController controllerWithNavigationForRoot:root];
self.window.rootViewController = navi;

これはモーダルになっていないので普通に使えます。
画面下部にピッカーが表示されて、閉じることができます。

下記は QuickDialogをモーダル表示しています。
こちらはピッカーを閉じることができません。

AppDelegate.m
UINavigationController *navi = [QuickDialogController controllerWithNavigationForRoot:root];

navi.modalPresentationStyle = UIModalPresentationFormSheet;
navi.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.window.rootViewController presentModalViewController:navi animated:YES];

対処法としてはこちらになります。
≫UINavigationController resignFirstResponderでキーボードが閉じない場合の対処法

UIViewController+KeyboardDismiss.h
#import <Foundation/Foundation.h>
@interface UIViewController(KeyboardDismiss)
@end
UIViewController+KeyboardDismiss.m
#import "UIViewController+KeyboardDismiss.h"

@implementation UIViewController(KeyboardDismiss)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}
#pragma clang diagnostic pop
@end

「#pragma」を記載しているのは、余計なアラートを非表示にするためです。

それを Supporting Filesの {プロジェクト名}-Prefix.pch で import すればOKです。

{プロジェクト名}-Prefix.pch
#ifdef __OBJC__
    #import "UIViewController+KeyboardDismiss.h"
    #import "QuickDialog.h"
#endif

まだしっかりテストしていないのでどこかで不具合が発生するかもしれません。
不具合を見付けた方は教えていただけると嬉しいです。

4
4
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
4
4