2010-07-27 98 views
6

我已經通過此網站搜索,我無法找到我現在面臨的問題的解決方案。希望有人能幫忙。ResignFirstResponder不關閉鍵盤(iPhone)

我創建了一個UIAlertView來提示用戶在iPhone應用程序中輸入他們的名字。

UIAlertView *enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name" 
                  message:@"\n\n\n" 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
                otherButtonTitles:NSLocalizedString(@"OK", nil),nil]; 

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)]; 
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert; 
    enterNameField.borderStyle = UITextBorderStyleRoundedRect; 
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo; 
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    enterNameField.returnKeyType = UIReturnKeyDone; 
    enterNameField.delegate = self; 
    [enterNameField becomeFirstResponder]; 
    [enterNameAlert addSubview:enterNameField]; 

    [enterNameAlert show]; 
    [enterNameAlert release]; 
    [enterNameField release]; 

我設置這個的viewController遵守UITextFieldDelegate在頭文件,並實施textFieldShouldReturn:試圖解僱鍵盤時,用戶點擊完成。

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if ([textField isFirstResponder]) { 
     [textField resignFirstResponder]; 
     NSLog(@"text field was first responder"); 
    } else { 
     [textField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
     NSLog(@"text field was not first responder"); 
    } 
    NSLog(@"textfieldshouldreturn"); 
    return YES; 
} 

在調試程序,我確認成功時,我完成按鈕點擊調用此方法,與文本框是當時的第一響應。然而,鍵盤並沒有消失,但小小的clearButton消失了。很明顯,textField不再是第一個響應者,因爲當我再次單擊完成按鈕時,什麼都不會被調用。我只想用完成按鈕來關閉鍵盤。任何人都可以提供解決方案嗎?萬分感謝。

+0

如果將文本字段設置爲視圖控制器中的屬性,從而確保即使在警報解除後仍保留它,會發生什麼情況?我想知道是否它可能會在事件循環開始發送resignFirstResponder消息之前得到釋放,或者是類似的東西。 P.S.我們曾經一起工作嗎? – clozach 2010-08-30 10:12:16

回答

6

首先,您需要在界面標題中定義您的enterNameAlert。然後使用下面的代碼。

- (void)viewDidLoad {  
    [super viewDidLoad]; 
    enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name" 
                  message:@"\n\n\n" 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
                otherButtonTitles:NSLocalizedString(@"OK", nil),nil]; 

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)]; 
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert; 
    enterNameField.borderStyle = UITextBorderStyleRoundedRect; 
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo; 
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    enterNameField.returnKeyType = UIReturnKeyDone; 
    enterNameField.delegate = self;  
    [enterNameAlert addSubview:enterNameField]; 
    [enterNameField becomeFirstResponder]; 
    [enterNameAlert show];  
    [enterNameField release]; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if ([textField isFirstResponder]) { 
     [textField resignFirstResponder]; 
     [enterNameAlert dismissWithClickedButtonIndex:1 animated:YES]; 
     [enterNameAlert release]; 
     NSLog(@"text field was first responder"); 
    } else { 
     [textField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
     NSLog(@"text field was not first responder"); 
    } 
    NSLog(@"textfieldshouldreturn"); 
    return YES; 
} 
+0

這工作!但是我必須從 - (BOOL)textFieldShouldReturn:(UITextField *)textField方法中刪除[enterNameAlert release]。否則,我點擊完成按鈕後,該應用程序將簡單地崩潰並退出。但是我對記憶的東西並不是很熟悉。這樣做會不會有內存泄漏? – Anthony 2010-12-03 10:39:57

+0

如果您不想在textFieldShouldReturn中釋放enterNameAlert。沒關係。 但是你必須在實現中的其他地方釋放它。可以說: -dealloc { [enterNameAlert release]; [super dealloc]; } – 2010-12-14 06:45:58

+0

嗯,[不適合我](http://stackoverflow.com/q/6866932/434423)。 – 2011-07-31 17:51:14

0

如果在調用resignFirstResponder方法之後將文本字段的釋放移動到委託方法,會發生什麼情況?

+0

感謝您的幫助。但這不起作用。 – Anthony 2010-12-03 10:29:50

0

嘗試在TextField的「DidEndOnExit」事件中使用resignFirstResponder取消鍵盤。

然後嘗試在完成將數據輸入到TextField中時按鍵盤上的完成按鈕來關閉鍵盤。

希望這會有所幫助。

+0

上 實現resignFirstResponder - (IBAction爲)DidEndOnExit:(ID)發送 {// 你的代碼放在這裏 } – 2010-10-12 04:33:15

+0

這篇上述解決方案的幫助? – 2010-10-13 03:48:38

+0

感謝您的幫助。但這不起作用。 – Anthony 2010-12-03 10:37:23

0

有另一個對象成爲,然後立即辭去第一響應者。

+0

對不起,我不太確定我該怎麼做到這一點。 – Anthony 2010-12-03 10:30:28

0

根本就

[mytextField addTarget:self 
      action:@selector(methodToFire:) 
      forControlEvents:UIControlEventEditingDidEndOnExit]; 
0

如果有人有這個在故事板的麻煩,我不得不進入我uitextfields性能和Ctrl +拖動從委託其根視圖控制器都在故事板和修復了所有問題..