2009-11-13 84 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