2010-10-24 78 views
4

我有一個定製的UIAlertView.I,該AlertView中有一個UITextField,一旦顯示,它就成爲第一個響應者。現在,當用戶觸摸AlertView中的其他位置時,我需要關閉該UITextField的鍵盤。我已經爲此接觸了事件。在UIAlertView中關閉UITextField的鍵盤

一切都很到位並且工作正常,除非我在UITextField上調用resignFirstResponder時,它將從第一響應者辭職,但鍵盤不會被解除。有什麼辦法可以解僱那個鍵盤嗎?

我一直在尋找的解決方案,並發現了一個類似的帖子here沒有答案

如果有人能找到一條出路請讓我知道。我甚至嘗試了以下方法,但它不能正常工作

UIWindow* tempWindow; 

    // Because we cant get access to the UIKeyboard throught the SDK we will just use UIView. 
    // UIKeyboard is a subclass of UIView anyways 
    UIView* keyboard; 

    // Check each window in our application 
    for(int c = 0; c < [[[UIApplication sharedApplication] windows] count]; C++) 
    { 
     // Get a reference of the current window 
     tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:c]; 
     for(int i = 0; i < [tempWindow.subviews count]; i++) 
     { 
      // Get a reference to the current view 
      keyboard = [tempWindow.subviews objectAtIndex:i]; 

      // Loop through all views in the current window 

      if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES){ 
       [keyboard removeFromSuperview]; 
      } 

     } 
    } 

回答

1

您是否使用自定義代碼來顯示鍵盤?如果不是,請嘗試使用this StackOverflow question中的代碼。我懷疑resignFirstResponder消息沒有達到正確的控制。

(在這個問題的答案的代碼通常是有用的,從SDK最缺的,恕我直言。)

7

必須調用resignFirstResponder在UIAlertField,

如:

[textField resignFirstResponder];[alertView resignFirstResponder]; 
+0

這真的幫助!謝謝! – hawshy 2012-03-02 09:37:03

+0

無論如何有多少firstResponders? – 2012-11-13 11:05:45

0

有沒有需要發送一個resignFirstResponderUIAlertView子類。只需覆蓋becomeFirstResponder即可返回UIAlertView子類中的NO

0

顯然,當您在UITextField上退出第一響應者時,UIAlertView將成爲下一個響應者,由於某些不明確的原因而使鍵盤保持原位。
辭職也會使鍵盤消失或者確實會覆蓋becomeFirstResponder以返回NO。 在我的情況下,這個解決方案使得UIAlertview在左上角呈現動畫效果,並且立即返回到原來的位置,看起來非常難看,我似乎無法找出原因,但也許其他人對此有些想法? 這裏是從UIAlertView中派生的類我的代碼提取物:

- (BOOL)becomeFirstResponder 
{ 
    return NO; 
} 

- (void)someCustomButtonClicked:(id)sender 
{ 
    [textField resignFirstResponder]; 
    // ... 
} 
1
[self resignFirstResponder]; 

self裝置UIAlertView

在我的情況下,它的工作原理。

0

嘗試這些方法

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Welcome" message:@"Please Enter Login and Password" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [loginAlert setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput]; 
    [loginAlert textFieldAtIndex:0].delegate = self; 
    [loginAlert textFieldAtIndex:1].delegate = self; 
    [loginAlert setTag:777]; 
    [loginAlert show]; 
    [loginAlert release]; 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 

    return YES; 
} 

,你應該(超文本,因爲堆棧溢出需要至少20個字符)。在頭文件中添加UITextFieldDelegate

0

我剛纔遇到了這個問題。 以下是我已經解決了這個問題:

首先,請您textField.delegate = self;

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Title" message:nil delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"OK", nil, nil]; 

    UITextField *oldPassWord = [alertView textFieldAtIndex:0]; 
    oldPassWord.delegate =self; 

    UITextField *newPassWord = [alertView textFieldAtIndex:1]; 
    newPassWord.delegate =self; 

    [alertView show]; 

然後,[textField resignFirstResponder];

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    [[alertView textFieldAtIndex:buttonIndex]resignFirstResponder]; 
}