在分配第一响应者之前,如何指定键盘指针

时间:2014-06-30 05:03:29

标签: ios keyboard hide uikeyboard uiwindow

我正在尝试创建一个用户界面,使用户可以在使用聊天应用程序时在键盘和其他菜单之间切换。

单击textField栏我想要提升键盘或集合视图。

当我点击“菜单”时出现问题'按钮。我希望textField栏能够显示我的菜单视图。然后,单击键盘按钮,立即切换到键盘,而不是从底部向上滑动。这意味着我需要将键盘加载并隐藏在应用程序的背景中。

目前虽然我最早设法为键盘分配变量是在keyboardDidShow函数中。

-(void) keyboardDidShow: (NSNotification *) notification {

    // Get the window the keyboard is a subview of
    _window = [UIApplication sharedApplication].windows.lastObject;

    _keyboard = _window.subviews[0]; 
}

这意味着在我加载之后我可以隐藏并显示它,但是当它第一次加载时我不希望它可见。

为了使用替代方法实现这一点,我尝试将我的额外视图添加为创建键盘的UIWindow的子视图:

[_window addSubview:_menuView];
[_window addSubview:_gamesView];
[_window addSubview:_stickerView];

[self hideSpecificView];

不幸的是我一直遇到同样的问题,直到我需要完全加载键盘之后才能加载键盘,然后才能获得指向它的指针来隐藏它。

这是我的工具栏的图片,我不清楚:

enter image description here

单击菜单图标或贴纸图标时,我希望使用集合视图抬起该栏。如果我然后单击文本字段,这些视图可见,我想隐藏可见视图以立即显示键盘背后。

我也尝试过使用keyboardWillShow,但由于窗口没有加载到我们的屏幕前面,我无法获得指向键盘的指针,以便在加载前隐藏它。

我所追求的一个例子可以找到很多聊天应用程序(facebook messenger,LINE,Kakao Talk)

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

虽然我提出的方式并不完美,但它几乎完美无缺,所以希望这可能会对未来的人有所帮助。如果其他人以不同的方式解决了它,请发布,因为知道你是如何做到这一点会很有趣。

我开始在我的头文件中向UIWindow添加一个类变量,然后在键盘显示方法完成后设置一个定时器来ping。这个方法完成后,键盘已经创建,只是,所以我分配并隐藏它。

-(void) keyboardWillShow: (NSNotification *) notification {

    // More keyboard code

    _window = [UIApplication sharedApplication].windows.lastObject;

    [NSTimer scheduledTimerWithTimeInterval:0.01
                                     target:self
                                   selector:@selector(allocateKeyboard)
                                   userInfo:nil
                                    repeats:NO];
}

- (void)allocateKeyboard {

    if (!_keyboard) {
        _keyboard = _window.subviews[0];
    }

    _keyboard.hidden = YES;

    [self setViewForButtonType];
}

我之前已经添加了其他视图,隐藏了它们并将它们限制在主视图的底部,这意味着当键盘上升时它们也会这样做。

- (void)viewDidLoad {

[self.view addSubview:_menuView];
[self.view addSubview:_gamesView];
[self.view addSubview:_stickerView];

}

...

- (void)hideViews {

    _keyboard.hidden = YES;
    _menuView.hidden = YES;
    _gamesView.hidden = YES;
    _stickerView.hidden = YES;
}

当按下按钮时,我会取消隐藏我想要查看的视图并隐藏其余视图。

当我说这种方法不能很好地工作时,这是因为如果您在第一次加载键盘之前加载视图主视图然后单击按钮,那么您可以快速浏览一下键盘。视图显示在顶部。这虽然只是第一次发生,但前提是他们不先点击文本字段。

无论如何,我发现这是使视图看起来像在键盘前面的最好方法。显然我的代码更长,更复杂(这里太长了),但这是我用来解决它的方法的要点。如果您有任何疑问,请发表评论,我希望这会有所帮助。