我有一个包含文本字段的视图控制器(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
中的通知操作会被调用。
答案 0 :(得分:4)
在推送第二个视图控制器之前,我将第一个视图控制器作为观察者删除:
也许这不是正在发生的事情。事实上,在我看来,viewWillDisappear
在推动之前是不可能的。
我不确定但是当您推动新的视图控制器并且键盘立即出现时,可能会在其他视图消失之前触发通知。
您可以尝试在启动推送时移除观察者(例如在prepareForSegue
中)。
答案 1 :(得分:2)
我想在VC2中你在loadView或viewDidLoad中显示键盘,所以顺序为:VC2 viewDidLoad,keyboardShow,VC1 viewWillDisappear。
因此在keyboardDidShow方法中,只有当visibleController为self时才能执行某些操作。
此外,我认为您不应该在viewWillDisappear或viewWillDisappear中处理此通知,请尝试更好的方法。你必须在dealloc方法中删除Observer。