最近在網上看到一個“在iPhone開發中給鍵盤加個隱藏工具條”的demo,下下來後,運行後發現,點擊“隱藏鍵盤”之後,之前的TableView不能恢復為應用剛啟動時的顯示,因為當TextField獲得焦點時,會彈出軟鍵盤,相應的需要通過程序調整界面上的TableView,修改其Frame將之上移。(注:TableView中放了五個TextField)。但是點擊“隱藏鍵盤”後,TableView還是維持在其Frame修改之後的樣子,沒有恢復為應用剛啟動時的樣子。
嘗試過在
- (void)textFieldDidEndEditing:(UITextField *)textField;方法中添加修改TableView的Frame使之恢復啟動時顯示樣子的語句,但是發現只要TextField的焦點發生變化,就會調用這個API,比如從第一個TextField跳到第二個TextField,焦點從第一個切換到第二個,再從第二個切換到第三個,第四個。。。只要任意一個TextField發生失去焦點事件,就會調用這個API。結果造成每發生一次焦點切換,界面就會先恢復應用啟動時顯示的樣子,然後很快又變成Frame被修改之後的樣子。
也嘗試過注冊軟鍵盤顯示和隱蔵的通知
發現也是一樣,焦點從一個TextField切換到另一個TextField,就會先後發送一次UIKeyboardWillHideNotification和UIKeyboardWillShowNotification通知,還是不能實現想要的效果,即只是在點擊了“隱藏鍵盤”之後,才恢復主界面上TableView顯示。
後來想到了自定義通知,才解決這個問題:
Demo裡面有個HiddenKeyBoard函數,這個是點擊“隱藏鍵盤”按鈕之後會調用的selector,那就在這個裡面添加發送通知語句:
[[NSNotificationCenterdefaultCenter]postNotificationName:@"mytest"object:nil];
然後在ViewController的viewWillAppear裡面注冊這個通知:
- (void)viewWillAppear:(BOOL)animated {
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(doAfterKeyboardbarHidden:)name:@"mytest"object:nil];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
//[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenterdefaultCenter] removeObserver:selfname:@"mytest"object:nil];
[super viewWillDisappear:animated];
}
- (void)doAfterKeyboardbarHidden:(NSNotification*)notification {
//id obj = [notification object];//獲取到傳遞的對象
NSLog(@"++++++ //// +++++");
tableview.frame = CGRectMake(0,40, 320, 340);
}
OK!想要的效果實現了!
貼兩張圖:第一張是輸入,輸入完就點“隱藏鍵盤”,馬上界面就恢復正常顯示了,即第二張圖:
摘自 Code Heaven