2009-11-13 40 views
0

当键盘出现时,我需要移动视图控制器的UI元素。我这样做,在我的应用程序代理注册的键盘通知:iPhone SDK:处理键盘外观

[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:observer 
             selector:@selector(keyboardWasHidden:) 
              name:UIKeyboardDidHideNotification object:nil]; 

,然后处理通知苹果规定的(我有一个键盘表现出类似的代码)滚动视图上下:

- (void)keyboardWasHidden:(NSNotification*)aNotification { CGRect viewFrame = [self.view frame]; viewFrame.origin.y += keyboardSize.height - TOOLBAR_HEIGHT; self.view.frame = viewFrame; }

到目前为止好。现在问题描述:

当我执行这个代码来显示OS 3.0的具体消息UI:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; [self presentModalViewController:picker animated:YES];

,当键盘显示了实际的邮件UI,我仍然得到键盘通知其滚动我查看并因此破坏我的用户界面(请注意,邮件控制器需要整个屏幕,并且此时我的视图甚至不可见)。

我希望暂时禁用键盘的通知,让我滚动的代码将不会被调用这一行:

[[NSNotificationCenter defaultCenter] removeObserver:self];

但它没有帮助,甚至键盘仍然可以公布。

我该怎么做才能避免在消息UI创建时在键盘上作出反应?

回答

1

添加BOOL属性或实例变量:careAboutKeyboard这是给你的keyboardWasShown:keywardWasHidden:方法都可以访问,可能会在视图控制器的方法在

有它设置为YESviewWillAppear方法,并设置到NO当您显示邮件视图和viewWillDisappear时。

然后把所有的滚动逻辑在if块:

if(careAboutKeyboard) { 
    // Scrolling logic 
} 
+0

伟大的心灵略同!在我发布这篇文章后,我一直在想这个应用程序是可以尝试的。 你能否澄清什么是“原子”属性?我只是在类中添加BOOL变量,甚至没有属性。 – leon 2009-11-13 19:02:10

+0

如果你的应用程序是单线程的,你不必担心原子性。实际上,因为只有事件线程应该调用我命名的方法,所以忘记我甚至说过原子。我编辑了我的答案。 – 2009-11-13 19:32:23