1

我有一个包含文本字段的视图控制器(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];
}

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

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

4

2 回答 2

4

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

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

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

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

于 2013-08-24T23:07:36.030 回答
2

我猜在VC2中你在loadView或者viewDidLoad中显示键盘,所以顺序是:VC2 viewDidLoad,keyboardShow,VC1 viewWillDisappear。</p>

所以在keyboardDidShow方法中,只有当visibleController为self时才能做某事。

另外,我认为你不应该在 viewWillDisappear 或 viewWillDisappear 中处理这个通知,试试更好的方法。并且您必须在 dealloc 方法中 removeObserver 。

于 2013-08-25T01:22:29.830 回答