2010-10-24 47 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]; 
}