4

我有一个自定义 UIAlertView。我在该 AlertView 中有一个 UITextField,它一显示就成为 firstResponder。现在,当用户触摸 AlertView 中的其他位置时,我需要关闭该 UITextField 的键盘。我为此举办了 touchesBegan 活动。

一切都到位并且工作正常,除了当我在 UITextField 上调用 resignFirstResponder 时,它不再是第一响应者,但键盘没有被关闭。有什么办法可以解除那个键盘。

我正在寻找解决方案,并在这里找到了类似的帖子,但没有答案

如果有人能够找到出路,请告诉我。我什至尝试了以下方式,但它不起作用

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];
            }

        }
    }
4

8 回答 8

7

您必须在 UIAlertField 上调用 resignFirstResponder,

例如:

[textField resignFirstResponder];[alertView resignFirstResponder];
于 2011-02-25T10:15:38.617 回答
1
[self resignFirstResponder];

self意味着UIAlertView

就我而言,它有效。

于 2012-01-03T09:34:37.740 回答
1

您是否使用自定义代码来显示键盘?如果没有,请尝试使用此 StackOverflow question中的代码。我怀疑resignFirstResponder消息没有得到正确的控制。

(该答案中的代码通常很有用,并且在 SDK 中非常缺乏,恕我直言。)

于 2010-10-24T19:22:57.727 回答
0

无需向子类发送resignFirstRespondera UIAlertView。只需覆盖以在子类becomeFirstResponder中返回。NOUIAlertView

于 2011-08-03T10:40:41.260 回答
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;
}

你应该在头文件中添加UITextFieldDelegate 。

于 2014-01-31T06:42:27.500 回答
0

显然,当您辞去 UITextField 上的第一响应者时, UIAlertView 将成为下一个响应者,出于某种晦涩的原因将键盘保持在原位。
辞职也使键盘消失或更好地确实覆盖了 becomeFirstResponder 以返回 NO。在我的情况下,这个解决方案使 UIAlertview 动画到左上角并立即动画回到原位,之后看起来非常丑陋,我似乎无法找出这是为什么,但也许其他人对此有一些想法?这是我从 UIAlertView 派生的类中提取的代码:

- (BOOL)becomeFirstResponder
{
    return NO;
}

- (void)someCustomButtonClicked:(id)sender 
{
    [textField resignFirstResponder];
    // ...
}
于 2011-10-21T08:10:05.367 回答
0

-[UIView 结束编辑:]

http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/endEditing

(额外文本,因为 Stack Overflow 至少需要 20 个字符。)

于 2013-08-18T16:53:34.087 回答
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];
}
于 2015-12-09T08:21:29.603 回答