UIKeyboardDidShowNotification在两个ViewControllers中调用

时间:2013-08-24 20:49:41

标签: ios objective-c cocoa-touch uitextview nsnotificationcenter

我有一个包含文本字段的视图控制器(UICollectionView)。在这个控制器中,我倾听UIKeyboardDidShowNotification:s。像这样:

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification  object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];
}

viewWillAppear

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self registerForKeyboardNotifications];
    [...]

在另一个视图控制器中,我有一个UITextView。该控制器还侦听UIKeyboardDidShowNotification。在我推送第二个视图控制器之前,我将第一个视图控制器作为观察者删除:

- (void)viewWillDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

但是当键盘出现在VC2中时,keyboardDidShow动作也会在VC1中被调用,从而导致不需要的动画。是否有可能以某种方式避免这种行为?

更新 奇怪的是,当我点击VC1中的后退按钮时,VC2中的通知操作会被调用。

2 个答案:

答案 0 :(得分:4)

  

在推送第二个视图控制器之前,我将第一个视图控制器作为观察者删除:

也许这不是正在发生的事情。事实上,在我看来,viewWillDisappear在推动之前是不可能的。

我不确定但是当您推动新的视图控制器并且键盘立即出现时,可能会在其他视图消失之前触发通知。

您可以尝试在启动推送时移除观察者(例如在prepareForSegue中)。

答案 1 :(得分:2)

我想在VC2中你在loadView或viewDidLoad中显示键盘,所以顺序为:VC2 viewDidLoad,keyboardShow,VC1 viewWillDisappear。

因此在keyboardDidShow方法中,只有当visibleController为self时才能执行某些操作。

此外,我认为您不应该在viewWillDisappear或viewWillDisappear中处理此通知,请尝试更好的方法。你必须在dealloc方法中删除Observer。