iPhone SDK:处理键盘外观

时间:2009-11-13 16:05:27

标签: iphone uiviewcontroller nsnotifications

当键盘出现时,我需要移动视图控制器的UI元素。我是通过在我的app delegate中注册键盘通知来完成此操作的:

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

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

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

然后处理Apple规定的通知(我显示了类似的键盘代码)来上下滚动视图:

到现在为止还挺好。现在问题描述:

当我执行此代码以显示OS 3.0特定消息UI时:

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

当键盘显示在实际的邮件用户界面中时,我仍然会收到键盘通知,滚动我的视图,从而破坏我的用户界面(注意邮件控制器占用整个屏幕,此时我的视图甚至都不可见)。

我希望暂时禁用键盘通知,因此不会使用此行调用我的滚动代码:

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

但它没有帮助,键盘甚至还没有发布。

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

1 个答案:

答案 0 :(得分:1)

添加BOOL属性或实例变量:careAboutKeyboardkeyboardWasShown:keywardWasHidden:方法都可以访问这些属性,可能在视图控制器中可以使用这些方法。

YES方法中将其设置为viewWillAppear,在显示邮件视图时设置为NO并在viewWillDisappear中设置。

然后将所有滚动逻辑放在if块中:

if(careAboutKeyboard) {
    // Scrolling logic
}