設定画面などを少ない記述で作ることのできるライブラリ 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
まだしっかりテストしていないのでどこかで不具合が発生するかもしれません。
不具合を見付けた方は教えていただけると嬉しいです。