如果键盘已经显示,如何获取键盘?

时间:2013-03-22 04:26:43

标签: objective-c cocoa-touch

我有一个自定义UITextField课程,需要在显示键盘后才能抓住它。所以,在课堂上我会听UIKeyboardWillShowNotification并从UIKeyboardFrameEndUserInfoKey抓住键盘的矩形。如果当前未显示键盘,则此功能非常有用。但是,如果键盘已经显示 - 例如当您在文本字段之间点击时 - UIKeyboardWillShowNotification将仅针对点击的第一个文本字段触发。对于其他所有文本字段,我无法知道键盘的内容是什么。

有关如何在键盘显示之后获得键盘的任何建议

1 个答案:

答案 0 :(得分:1)

AppDelegate keyboardFrame属性提供给您。让AppDelegate观察UIKeyboardWillShowNotificationUIKeyboardWillHideNotification并适当更新属性。隐藏键盘时将属性设置为CGRectNull,或添加单独的keyboardIsShowing属性。 (您可以使用CGRectNull功能测试CGRectIsNull。)

然后任何对象都可以随时使用此咒语检查键盘框架:

[[UIApplication sharedApplication].delegate keyboardFrame]

如果你不想把它放到你的app委托中,你可以创建一个单独的单例类,例如。

@interface KeyboardProxy

+ (KeyboardProxy *)sharedProxy;

@property (nonatomic, readonly) CGRect frame;
@property (nonatomic, readonly) BOOL visible;

@end

@implementation KeyboardProxy

#pragma mark - Public API

+ (KeyboardProxy *)sharedProxy {
    static dispatch_once_t once;
    static KeyboardProxy *theProxy;
    dispatch_once(&once, ^{
        theProxy = [[self alloc] init];
    });
    return theProxy;
}

@synthesize frame = _frame;

- (BOOL)visible {
    return CGRectIsNull(self.frame);
}

#pragma mark - Implementation details

- (id)init {
    if (self = [super init]) {
        _frame = CGRectNull;
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    }
    return self;
}

- (void)keyboardWillShow:(NSNotification *)note {
    _frame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
}

- (void)keyboardWillHide:(NSNotification *)note {
    _frame = CGRectNull;
}

@end

但是如果您使用单独的单身人士,则需要务必从应用代表的[KeyboardProxy sharedProxy]拨打application:didFinishLaunchingWithOptions:,以便单身人士不会错过任何通知。