2012-09-07 117 views
2

我在這裏看了很多帖子關於這個話題,但我沒能找到一個回答我的問題,所以,希望你不會覺得無聊關於另一UIKeyboard後:-)UIKeyboardWillHide不會觸發

在我的視圖控制器的實現我添加了self作爲兩個通知UIKeyboardWillShowNotificationUIKeyboardWillHideNotification的觀察者,通過選擇器keyboardWillShow:keyboardWillHide:來處理通知。當我觸摸UITextField時,將調用keyboardWillShow:方法,但當按下「完成」按鈕(即關閉鍵盤)時,不會調用keyboardWillHide:方法。

真的,我想讓我的UITextField顯示鍵盤右下方的「隱藏按鈕」,但我無法找到正確的鍵盤類型。也許我需要將textfield retuntype設置爲「...完成」。這樣我看到「返回」鍵變成「完成」。

因此,我設置了一個工具欄爲我的UITextFieldinputAccessoryView,所以現在我可以用「完成」按鈕顯示上面帶有工具欄的標準鍵盤。當用戶觸摸該按鈕時,我用resignFirstResponder方法隱藏鍵盤。

奇怪的是,當我打電話給resignFirstResponder時,UIKeyboardWillHideNotification沒有發佈;至少不調用keyboardWillHide:方法。

你對我建議什麼?我真的想用小箭頭來顯示一個帶有向下箭頭的小鍵盤來隱藏鍵盤,但是這個解決方案可能是正確的,但是我想調整視圖的大小,並且爲此我需要觀察者UIKeyboardWillHideNotification

非常感謝您的幫助......

(增加:)

viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
              name:UIKeyboardWillShowNotification 
              object:[[self view] window]]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillHide:) 
              name:UIKeyboardWillHideNotification 
              object:[[self view] window]];  

我把這些聲明從 「你」 的帖子:-)之一,但willShow的作品...

UIToolbar中的「完成」按鈕的動作被分配爲我的文本fi的inputAccessoryView現場是:

-(void)keyboardDone { 
    [msgTextField resignFirstResponder]; 

閉合: 行!當一個開發商是愚蠢的......這是愚蠢的:-) :-)

這是我糾正willHide方法:

-(void)keyboardWillHide:(NSNotification*)n { 
    NSDictionary* userInfo; 
    CGSize keyboardSize; 
    CGRect viewFrame; 

    /* This was the bad guy :) I forgot to delete it 
    * after I previously copied the willShow method that 
    * checks if keyboard is already shown (if so returns). 
    * 
    * if(keyboardIsShown) 
    * return; 
    */ 
    userInfo = [n userInfo]; 
    keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    viewFrame = [[self scrollView] frame]; 
    viewFrame.size.height += (keyboardSize.height - TABBAR_HEIGHT); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:0.5]; 
    [[self scrollView] setFrame:viewFrame]; 
    [UIView commitAnimations]; 

    keyboardIsShown = NO; 
    NSLog(@"HIDE\n"); 
} 

所有我想感謝大家這個沒用上班第一幫助我。我想給你一些觀點,所以我會嘗試爲每個答案提出一個「興趣點」,但是我需要選擇正確的一個......難點部分...... :-)

Excuse我再次...我真的沒有看到if()語句...

+1

您可以發佈您的觀察員和方法? – Bot

+0

另外,這是在一個模式/提出的VC? – MishieMoo

+0

這是一個tabbar應用程序的視圖... –

回答

3

如果您閱讀文檔UIWindow它說這些通知的通知對象是nil。您將self.view.window作爲對象傳遞給addObserver:selector:name:object:方法。嘗試通過nil代替:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillShow:) 
              name:UIKeyboardWillShowNotification 
              object:nil; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWillHide:) 
              name:UIKeyboardWillHideNotification 
              object:nil]; 
+2

謝謝,但willShow的作品,但willHide不會被稱爲...奇怪... –

+0

@AltairJones所以你嘗試傳遞'nil'作爲'object'參數,但同樣的確切問題正在發生,即您的'keyboardWillShow:'方法被調用,但鍵盤隱藏沒有您的'keyboardWillHide:'方法被調用? –

+0

我選擇這個作爲正確的答案,因爲它提供了一些有關SDK如何工作的「學者」信息:-) –

1

檢查,如果真的keyboardDone被調用(與NSLog(@"%@", @"keyboard done called");即)。如果它被調用,但resignFirstResponder不利於駁回鍵盤,那就試試這個:

[self.view endEditing:YES];

也請提供您keyboardWillHide:方法。

+0

keyboardDone被調用,鍵盤被隱藏。 keyboardWillHide沒有被調用,我使用該函數來調整使用通知對象來獲取鍵盤大小。 –

+0

@AltairJones使用通知的'userInfo'字典獲取該信息,而不是'object'。請參閱:http://stackoverflow.com/questions/9135248/logic-for-moving-text-field-above-keyboard-on-tap/9136698#9136698 –

+0

你的'keyboardWillHide:'看起來像什麼...... 請試試這個,檢查,閹羊您'keyboardWillHide:'正確添加: '如果([自respondsToSelector:@selector(keyboardWillHide :)])'' {'' NSLog的(@ 「%@」 ,@「方法聲明正確」);' '}' –

1

要設置鍵盤,以便它有一個「完成」按鈕,這樣做:

1)設置您的視圖控制器,使其實現了UITextFieldDelegate。例如:

#import <UIKit/UIKit.h> 

@interface TX_ViewController : UIViewController <UITextFieldDelegate> 

@property (nonatomic, retain) IBOutlet UITextField *textField; 

@end 

2)在您的視圖控制器實現文件,使用下面的代碼來設置鍵盤:

- (void)viewDidLoad 
{ 
    [self.textField setDelegate:self]; 
    [self.textField setReturnKeyType:UIReturnKeyDone]; 
    [self.textField addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit]; 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

3),如果你希望做一些事情時,DONE按鈕被按下時,只需添加的功能到您的視圖控制器的實現文件:

- (IBAction)textFieldFinished:(id)sender 
{ 
    [sender resignFirstResponder]; 
} 

此外,如果您使用的接口構建器來創建您的界面,不要忘記爲TextField設置您的IBOutlet參考;否則,你的班級將不會收到來自XIB的消息。

我在示例應用程序中設置了它,只是爲了查看它是否有效,它是否以您希望應用程序執行的方式執行。

+0

非常感謝。那麼......有人不使用IB來創建視圖?你如何正確設計佈局? –

+0

當談到以編程方式創建視圖時,我仍然是一個新手。我目前使用IB來創建視圖。我曾與開發人員合作,他們選擇以編程方式進行此操作,但是當我必須閱讀他們的代碼時,這會讓我感到頭疼,因爲它對我來說從來沒有任何意義,因爲開發人員爲什麼要花費額外的時間編寫代碼以創建視圖所有這一切都是爲了你。我確信有一個積極的理由來進行這個項目,我還沒有在這個話題上談論我的時間。我希望我的回答幫助你解決你的問題。 :) –

0

請務必注意,當用戶通過隱藏按鈕隱藏軟件鍵盤時,隱藏方法不會被調用。顯示方法再次被調用,但鍵盤幾乎不在屏幕上,除了home行工具欄。

0

斯威夫特$

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

func keyboardWillHide(notification: NSNotification){ 
    print("keyboardWillHide") 
}